translatools 0.1.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.
- translatools-0.1.0/.gitignore +13 -0
- translatools-0.1.0/.python-version +1 -0
- translatools-0.1.0/PKG-INFO +67 -0
- translatools-0.1.0/README.md +56 -0
- translatools-0.1.0/pyproject.toml +21 -0
- translatools-0.1.0/src/translatools/__init__.py +87 -0
- translatools-0.1.0/src/translatools/__main__.py +4 -0
- translatools-0.1.0/src/translatools/paratranz.py +35 -0
- translatools-0.1.0/src/translatools/translatools.py +191 -0
- translatools-0.1.0/uv.lock +245 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.10
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: translatools
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Add your description here
|
|
5
|
+
Author-email: Taskeren <r0yalist@outlook.com>
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Requires-Dist: cursefetch==0.2.1
|
|
8
|
+
Requires-Dist: dacite>=1.9.2
|
|
9
|
+
Requires-Dist: ftb-snbt-lib>=0.4.1
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
|
|
12
|
+
# TranslaTools
|
|
13
|
+
|
|
14
|
+
A toolset of translating Minecraft modpacks.
|
|
15
|
+
|
|
16
|
+
_Currently working in progress._
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
### Start a new translation project
|
|
21
|
+
|
|
22
|
+
#### a) Download CurseForge Modpack
|
|
23
|
+
|
|
24
|
+
`translatools init {curseforge_project_id}`
|
|
25
|
+
|
|
26
|
+
Using the command to initialize the project in the current directory. The directory must be empty.
|
|
27
|
+
|
|
28
|
+
You need to add `CF_API_KEY` to the environment variable, or passing it as an argument `--api-key {the_key}`.
|
|
29
|
+
|
|
30
|
+
When the downloading is complete, you need to edit the `config.json` file, fill the `paratranz_id`. And there's a flaw
|
|
31
|
+
in the current version that `_cwd` is also exported to the config file, you can remove it.
|
|
32
|
+
|
|
33
|
+
#### b) Add Configuration to existing modpack directory
|
|
34
|
+
|
|
35
|
+
Create a file, `config.json` preferred.
|
|
36
|
+
|
|
37
|
+
```json5
|
|
38
|
+
{
|
|
39
|
+
// CurseForge project ID
|
|
40
|
+
"project_id": 345678,
|
|
41
|
+
// Paratranz project ID
|
|
42
|
+
"paratranz_id": 67890,
|
|
43
|
+
// The CurseForge file ID, or 0 if you don't know
|
|
44
|
+
// It's used for updating the files from the latest version. Not implemented yet.
|
|
45
|
+
"current_version_id": 1234567,
|
|
46
|
+
// A list of paths to tracked JSONs
|
|
47
|
+
// And glob is supported, where you can use '*' and '**' for matching multiple files,
|
|
48
|
+
// See glob: https://en.wikipedia.org/wiki/Glob_(programming)
|
|
49
|
+
"tracked_json_paths": [
|
|
50
|
+
"overrides/foo/bar/*.json"
|
|
51
|
+
],
|
|
52
|
+
"tracked_lang_paths": [
|
|
53
|
+
"overrides/resources/**/lang/en_us.lang"
|
|
54
|
+
],
|
|
55
|
+
// true to enable ftb quests support
|
|
56
|
+
"ftbquests": false
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Fill in these fields, and **remove the comments**, because they're not supported in standard JSON.
|
|
61
|
+
|
|
62
|
+
### Upload to Paratranz
|
|
63
|
+
|
|
64
|
+
`translatools sync2paratranz`
|
|
65
|
+
|
|
66
|
+
Like initialization, you need to add `PARATRANZ_API_KEY` to the environment variable, or passing it as an argument
|
|
67
|
+
`--api-key {the_key}`
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# TranslaTools
|
|
2
|
+
|
|
3
|
+
A toolset of translating Minecraft modpacks.
|
|
4
|
+
|
|
5
|
+
_Currently working in progress._
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
### Start a new translation project
|
|
10
|
+
|
|
11
|
+
#### a) Download CurseForge Modpack
|
|
12
|
+
|
|
13
|
+
`translatools init {curseforge_project_id}`
|
|
14
|
+
|
|
15
|
+
Using the command to initialize the project in the current directory. The directory must be empty.
|
|
16
|
+
|
|
17
|
+
You need to add `CF_API_KEY` to the environment variable, or passing it as an argument `--api-key {the_key}`.
|
|
18
|
+
|
|
19
|
+
When the downloading is complete, you need to edit the `config.json` file, fill the `paratranz_id`. And there's a flaw
|
|
20
|
+
in the current version that `_cwd` is also exported to the config file, you can remove it.
|
|
21
|
+
|
|
22
|
+
#### b) Add Configuration to existing modpack directory
|
|
23
|
+
|
|
24
|
+
Create a file, `config.json` preferred.
|
|
25
|
+
|
|
26
|
+
```json5
|
|
27
|
+
{
|
|
28
|
+
// CurseForge project ID
|
|
29
|
+
"project_id": 345678,
|
|
30
|
+
// Paratranz project ID
|
|
31
|
+
"paratranz_id": 67890,
|
|
32
|
+
// The CurseForge file ID, or 0 if you don't know
|
|
33
|
+
// It's used for updating the files from the latest version. Not implemented yet.
|
|
34
|
+
"current_version_id": 1234567,
|
|
35
|
+
// A list of paths to tracked JSONs
|
|
36
|
+
// And glob is supported, where you can use '*' and '**' for matching multiple files,
|
|
37
|
+
// See glob: https://en.wikipedia.org/wiki/Glob_(programming)
|
|
38
|
+
"tracked_json_paths": [
|
|
39
|
+
"overrides/foo/bar/*.json"
|
|
40
|
+
],
|
|
41
|
+
"tracked_lang_paths": [
|
|
42
|
+
"overrides/resources/**/lang/en_us.lang"
|
|
43
|
+
],
|
|
44
|
+
// true to enable ftb quests support
|
|
45
|
+
"ftbquests": false
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Fill in these fields, and **remove the comments**, because they're not supported in standard JSON.
|
|
50
|
+
|
|
51
|
+
### Upload to Paratranz
|
|
52
|
+
|
|
53
|
+
`translatools sync2paratranz`
|
|
54
|
+
|
|
55
|
+
Like initialization, you need to add `PARATRANZ_API_KEY` to the environment variable, or passing it as an argument
|
|
56
|
+
`--api-key {the_key}`
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "translatools"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Add your description here"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
authors = [
|
|
7
|
+
{ name = "Taskeren", email = "r0yalist@outlook.com" }
|
|
8
|
+
]
|
|
9
|
+
requires-python = ">=3.10"
|
|
10
|
+
dependencies = [
|
|
11
|
+
"cursefetch==0.2.1",
|
|
12
|
+
"dacite>=1.9.2",
|
|
13
|
+
"ftb-snbt-lib>=0.4.1",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
[project.scripts]
|
|
17
|
+
translatools = "translatools:main"
|
|
18
|
+
|
|
19
|
+
[build-system]
|
|
20
|
+
requires = ["hatchling"]
|
|
21
|
+
build-backend = "hatchling.build"
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import json
|
|
3
|
+
import os.path
|
|
4
|
+
import sys
|
|
5
|
+
from dataclasses import asdict
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
import cursefetch
|
|
9
|
+
from dacite import from_dict
|
|
10
|
+
|
|
11
|
+
from translatools.paratranz import Paratranz
|
|
12
|
+
from translatools.translatools import TranslatoolsMetadata
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def main() -> None:
|
|
16
|
+
print("Hello from translatools!")
|
|
17
|
+
|
|
18
|
+
parser = argparse.ArgumentParser()
|
|
19
|
+
parser.add_argument("--config", help="The configuration of the instance.", default="config.json")
|
|
20
|
+
|
|
21
|
+
subparser = parser.add_subparsers(dest="command")
|
|
22
|
+
|
|
23
|
+
# init
|
|
24
|
+
init = subparser.add_parser("init", help="Initialize a new translation project from CurseForge packs.")
|
|
25
|
+
init.add_argument("project_id", help="The CurseForge project ID.")
|
|
26
|
+
init.add_argument("--version", help="The file id or name of the version to download.", default="latest")
|
|
27
|
+
init.add_argument("-t", "--release-type",
|
|
28
|
+
help="The release type to filter by. (default: none). (only applicable when version is 'latest')",
|
|
29
|
+
choices=["release", "beta", "alpha"], default=None)
|
|
30
|
+
init.add_argument("--api-key",
|
|
31
|
+
help="The CurseForge API key to use (can also be set via CF_API_KEY environment variable).")
|
|
32
|
+
init.add_argument("--allow-non-empty-directory", action="store_true")
|
|
33
|
+
|
|
34
|
+
# sync2paratranz
|
|
35
|
+
sync2paratranz = subparser.add_parser("sync2paratranz")
|
|
36
|
+
sync2paratranz.add_argument("--api-key",
|
|
37
|
+
help="The Paratranz API key to use (can also be set via PARATRANZ_API_KEY environment variable.)")
|
|
38
|
+
|
|
39
|
+
args = parser.parse_args()
|
|
40
|
+
|
|
41
|
+
match args.command:
|
|
42
|
+
case "init":
|
|
43
|
+
_command_init(args)
|
|
44
|
+
case "sync2paratranz":
|
|
45
|
+
_command_sync_to_paratranz(args)
|
|
46
|
+
case _:
|
|
47
|
+
parser.print_help()
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _command_init(args):
|
|
51
|
+
config_path = Path(args.config)
|
|
52
|
+
cwd = config_path.parent
|
|
53
|
+
|
|
54
|
+
# check if the directory is clear
|
|
55
|
+
if not args.allow_non_empty_directory and len(list(cwd.iterdir())) > 0:
|
|
56
|
+
sys.exit("Expected a empty directory.")
|
|
57
|
+
|
|
58
|
+
# download the modpack
|
|
59
|
+
if args.api_key is not None:
|
|
60
|
+
os.environ["CF_API_KEY"] = args.api_key
|
|
61
|
+
f = cursefetch.get_project_file(str(args.project_id), args.version, args.release_type)
|
|
62
|
+
cursefetch.download_project_file(f, ".", uncompress=True)
|
|
63
|
+
|
|
64
|
+
# write the config
|
|
65
|
+
config = TranslatoolsMetadata(
|
|
66
|
+
project_id=int(args.project_id),
|
|
67
|
+
paratranz_id=0,
|
|
68
|
+
current_version_id=f.id,
|
|
69
|
+
)
|
|
70
|
+
with open(config_path, "w+") as output:
|
|
71
|
+
json.dump(asdict(config), output, ensure_ascii=False, indent=4)
|
|
72
|
+
print(f"Initialized project at {cwd}.")
|
|
73
|
+
print("Modify the paratranz_id to start working with Paratranz.")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _command_sync_to_paratranz(args):
|
|
77
|
+
config_path = Path(args.config)
|
|
78
|
+
cwd = config_path.parent
|
|
79
|
+
|
|
80
|
+
if not config_path.exists():
|
|
81
|
+
sys.exit(f"Configuration file is missing, expected {config_path}")
|
|
82
|
+
config = from_dict(data_class=TranslatoolsMetadata, data=json.load(open(args.config)))
|
|
83
|
+
config.set_cwd(cwd)
|
|
84
|
+
|
|
85
|
+
para = Paratranz(os.environ.get("PARATRANZ_API_KEY", args.api_key))
|
|
86
|
+
|
|
87
|
+
config.sync_to_paratranz(para)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import requests
|
|
5
|
+
|
|
6
|
+
BASE_URL = "https://paratranz.cn/api"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Paratranz:
|
|
10
|
+
|
|
11
|
+
def __init__(self, token: str):
|
|
12
|
+
self.token = token
|
|
13
|
+
if len(token) == 0:
|
|
14
|
+
raise ValueError("A Paratranz token must be provided")
|
|
15
|
+
|
|
16
|
+
def get_file_list(self, paratranz_project_id: int) -> dict[str, Any]:
|
|
17
|
+
url = f"{BASE_URL}/projects/{paratranz_project_id}/files"
|
|
18
|
+
resp = requests.get(url, headers={"Authorization": f"Bearer {self.token}"})
|
|
19
|
+
resp.raise_for_status()
|
|
20
|
+
data = resp.json()
|
|
21
|
+
if not isinstance(data, list):
|
|
22
|
+
raise ValueError(f"Malformed response, expected a list payload: {data}")
|
|
23
|
+
data: list
|
|
24
|
+
return {v["name"]: v for v in data}
|
|
25
|
+
|
|
26
|
+
def put_file(self, paratranz_project_id: int, path: Path, relative_path: Path):
|
|
27
|
+
url = f"{BASE_URL}/projects/{paratranz_project_id}/files"
|
|
28
|
+
resp = requests.post(url, headers={"Authorization": f"Bearer {self.token}"}, files={"file": open(path, "r")},
|
|
29
|
+
data={"path": relative_path.parent.as_posix(), "filename": relative_path.name})
|
|
30
|
+
resp.raise_for_status()
|
|
31
|
+
|
|
32
|
+
def update_file(self, paratranz_project_id: int, file_id: str, path: Path):
|
|
33
|
+
url = f"{BASE_URL}/projects/{paratranz_project_id}/files/{file_id}"
|
|
34
|
+
resp = requests.post(url, headers={"Authorization": f"Bearer {self.token}"}, files={"file": open(path, "r")})
|
|
35
|
+
resp.raise_for_status()
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import traceback
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from os import PathLike
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Generator
|
|
7
|
+
|
|
8
|
+
import cursefetch
|
|
9
|
+
import ftb_snbt_lib
|
|
10
|
+
from ftb_snbt_lib.tag import Compound
|
|
11
|
+
from ftb_snbt_lib.tag import List
|
|
12
|
+
from tqdm import tqdm
|
|
13
|
+
|
|
14
|
+
from translatools.paratranz import Paratranz
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class TranslatoolsMetadata:
|
|
19
|
+
# the CurseForge project ID
|
|
20
|
+
project_id: int
|
|
21
|
+
# the Paratranz project ID
|
|
22
|
+
paratranz_id: int
|
|
23
|
+
# the CurseForge file ID, or 0 for unknown or uninitialized
|
|
24
|
+
current_version_id: int = 0
|
|
25
|
+
# the tracked flat key-value-paired JSON files, relative to the configuration file, glob supported
|
|
26
|
+
tracked_json_paths: list[str] = field(default_factory=list)
|
|
27
|
+
# the tracked Mojang-flavored LANG files, relative to the configuration file, glob supported
|
|
28
|
+
tracked_lang_paths: list[str] = field(default_factory=list)
|
|
29
|
+
# true to enable support for FTBQuests
|
|
30
|
+
# but if somehow the modpack doesn't contain FTB Quests, or the contents are already localization-friendly,
|
|
31
|
+
# set it to false.
|
|
32
|
+
ftbquests: bool = True
|
|
33
|
+
|
|
34
|
+
_cwd: Path | None = None
|
|
35
|
+
|
|
36
|
+
def set_cwd(self, cwd: PathLike):
|
|
37
|
+
self._cwd = Path(cwd)
|
|
38
|
+
|
|
39
|
+
def relative_path(self, path: str) -> Path:
|
|
40
|
+
if self._cwd is not None:
|
|
41
|
+
return self._cwd / path
|
|
42
|
+
else:
|
|
43
|
+
return Path(path)
|
|
44
|
+
|
|
45
|
+
def install(self):
|
|
46
|
+
f = cursefetch.get_project_file(str(self.project_id), "latest")
|
|
47
|
+
cursefetch.download_project_file(f, "workspace", uncompress=True)
|
|
48
|
+
|
|
49
|
+
def handle_ftbquests(self):
|
|
50
|
+
# using ** to match any 'overrides', as long as it is in the directory.
|
|
51
|
+
for path in tqdm(self._cwd.glob("**/config/ftbquests/quests/chapters/*.snbt"),
|
|
52
|
+
desc="Converting FTB Quests Chapters"):
|
|
53
|
+
result_json = generate_json_from_ftbquests_chapter(path)
|
|
54
|
+
# write the result to './ftbquests/{previous_chapter_filename}.json'
|
|
55
|
+
output_dir = self._cwd / "ftbquests"
|
|
56
|
+
if not output_dir.exists():
|
|
57
|
+
output_dir.mkdir(exist_ok=True)
|
|
58
|
+
with open(self._cwd / "ftbquests" / path.name.replace(".snbt", ".json"), "w+", encoding="utf-8") as output:
|
|
59
|
+
output.write(result_json)
|
|
60
|
+
|
|
61
|
+
def sync_to_paratranz(self, client: Paratranz):
|
|
62
|
+
# load existing
|
|
63
|
+
existing = client.get_file_list(self.paratranz_id)
|
|
64
|
+
|
|
65
|
+
def upload_or_update_files(path_generator: Generator[Path, None, None], desc: str):
|
|
66
|
+
for json_path in (bar := tqdm(path_generator, desc=desc)):
|
|
67
|
+
try:
|
|
68
|
+
bar.set_postfix_str(str(json_path))
|
|
69
|
+
normalized_path = json_path.relative_to(self._cwd)
|
|
70
|
+
if normalized_path.as_posix() in existing: # as_posix() makes '\\' to '/' when on Windows
|
|
71
|
+
data = existing[normalized_path.as_posix()]
|
|
72
|
+
file_id = data["id"]
|
|
73
|
+
client.update_file(self.paratranz_id, file_id, json_path)
|
|
74
|
+
else:
|
|
75
|
+
client.put_file(self.paratranz_id, json_path, normalized_path)
|
|
76
|
+
except Exception as e:
|
|
77
|
+
print(f"Failed to upload {json_path}")
|
|
78
|
+
traceback.print_exception(e)
|
|
79
|
+
|
|
80
|
+
# sync FTBQ first
|
|
81
|
+
if self.ftbquests:
|
|
82
|
+
self.handle_ftbquests()
|
|
83
|
+
ftbquests_dir = self._cwd / "ftbquests"
|
|
84
|
+
if ftbquests_dir.exists():
|
|
85
|
+
upload_or_update_files(ftbquests_dir.glob("*.*"), "Sync-ing FTB Quests")
|
|
86
|
+
else:
|
|
87
|
+
print("Skipped FTB Quests")
|
|
88
|
+
# sync JSON
|
|
89
|
+
for tracked_json_path in self.tracked_json_paths:
|
|
90
|
+
upload_or_update_files(self._cwd.glob(tracked_json_path), "Synch-ing tracked JSONs")
|
|
91
|
+
# handle LANG
|
|
92
|
+
for tracked_lang_path in self.tracked_lang_paths:
|
|
93
|
+
def lang_json_transform(g: Generator[Path, None, None]) -> Generator[Path, None, None]:
|
|
94
|
+
for lang_path in g:
|
|
95
|
+
try:
|
|
96
|
+
result = generate_json_from_lang(lang_path)
|
|
97
|
+
new_path = Path(lang_path.as_posix().replace(".lang", ".json"))
|
|
98
|
+
with open(new_path, "w+", encoding="utf-8") as json_file:
|
|
99
|
+
json_file.write(result)
|
|
100
|
+
yield new_path
|
|
101
|
+
except Exception as e:
|
|
102
|
+
print(f"Failed to convert LANG file to JSON format {lang_path}")
|
|
103
|
+
traceback.print_exception(e)
|
|
104
|
+
|
|
105
|
+
upload_or_update_files(lang_json_transform(self._cwd.glob(tracked_lang_path)), "Sync-ing tracked LANGs")
|
|
106
|
+
pass # other kind of shits
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@dataclass
|
|
110
|
+
class FTBQuestKeyGeneratingConfig:
|
|
111
|
+
quest_title: str = "ftbquests.chapter.{chapter_id}.quests.{quest_id}.title"
|
|
112
|
+
quest_subtitle: str = "ftbquests.chapter.{chapter_id}.quests.{quest_id}.subtitle"
|
|
113
|
+
quest_description: str = "ftbquests.chapter.{chapter_id}.quests.{quest_id}.description.{description_index}"
|
|
114
|
+
generate_description_index_for_empty_lines: bool = False
|
|
115
|
+
|
|
116
|
+
@staticmethod
|
|
117
|
+
def get_default() -> "FTBQuestKeyGeneratingConfig":
|
|
118
|
+
return FTBQuestKeyGeneratingConfig()
|
|
119
|
+
|
|
120
|
+
def get_title_key(self, chapter_id: str, quest_id: str):
|
|
121
|
+
return (self.quest_title
|
|
122
|
+
.replace("{chapter_id}", chapter_id)
|
|
123
|
+
.replace("{quest_id}", quest_id))
|
|
124
|
+
|
|
125
|
+
def get_subtitle_key(self, chapter_id: str, quest_id: str):
|
|
126
|
+
return (self.quest_subtitle
|
|
127
|
+
.replace("{chapter_id}", chapter_id)
|
|
128
|
+
.replace("{quest_id}", quest_id))
|
|
129
|
+
|
|
130
|
+
def get_description_key(self, chapter_id: str, quest_id: str, description_index: int):
|
|
131
|
+
return (self.quest_description
|
|
132
|
+
.replace("{chapter_id}", chapter_id)
|
|
133
|
+
.replace("{quest_id}", quest_id)
|
|
134
|
+
.replace("{description_index}", str(description_index)))
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def generate_json_from_ftbquests_chapter(snbt_path: PathLike,
|
|
138
|
+
config: FTBQuestKeyGeneratingConfig = FTBQuestKeyGeneratingConfig.get_default()) -> str:
|
|
139
|
+
"""
|
|
140
|
+
Generate key-value-paired JSON file from FTB Quests Chapter files.
|
|
141
|
+
:param snbt_path: the SNBT file path
|
|
142
|
+
:param config: the configuration
|
|
143
|
+
:return: the result JSON file content
|
|
144
|
+
"""
|
|
145
|
+
with open(snbt_path, encoding="utf-8") as f:
|
|
146
|
+
data = ftb_snbt_lib.load(f)
|
|
147
|
+
chapter_id = str(data["id"])
|
|
148
|
+
quests: List = data["quests"]
|
|
149
|
+
if not isinstance(quests, List):
|
|
150
|
+
raise ValueError("'quests' in the snbt is not a list")
|
|
151
|
+
|
|
152
|
+
result = dict()
|
|
153
|
+
for quest in quests:
|
|
154
|
+
quest: Compound
|
|
155
|
+
quest_id = str(quest["id"])
|
|
156
|
+
|
|
157
|
+
if "title" in quest:
|
|
158
|
+
title = quest["title"]
|
|
159
|
+
result[config.get_title_key(chapter_id, quest_id)] = str(title)
|
|
160
|
+
if "subtitle" in quest:
|
|
161
|
+
subtitle = quest["subtitle"]
|
|
162
|
+
result[config.get_subtitle_key(chapter_id, quest_id)] = str(subtitle)
|
|
163
|
+
if "description" in quest:
|
|
164
|
+
description: List = quest["description"]
|
|
165
|
+
count = 0
|
|
166
|
+
for index, desc in enumerate(description):
|
|
167
|
+
if config.generate_description_index_for_empty_lines:
|
|
168
|
+
result[config.get_description_key(chapter_id, quest_id, index)] = str(desc)
|
|
169
|
+
else:
|
|
170
|
+
result[config.get_description_key(chapter_id, quest_id, count)] = str(desc)
|
|
171
|
+
count += 1
|
|
172
|
+
|
|
173
|
+
return json.dumps(result, indent=4)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def generate_json_from_lang(lang_path: PathLike) -> str:
|
|
177
|
+
result = dict()
|
|
178
|
+
with open(lang_path, encoding="utf-8") as lang_file:
|
|
179
|
+
entries = lang_file.read().splitlines()
|
|
180
|
+
for entry in entries:
|
|
181
|
+
entry = entry.strip()
|
|
182
|
+
# ignore comments
|
|
183
|
+
if entry.startswith("#") or len(entry) == 0:
|
|
184
|
+
continue
|
|
185
|
+
pair = entry.split("=", maxsplit=1)
|
|
186
|
+
if len(pair) != 2:
|
|
187
|
+
raise ValueError(f"Unable to split the language entry: {entry}")
|
|
188
|
+
# store the key-value pair
|
|
189
|
+
result[pair[0]] = pair[1]
|
|
190
|
+
|
|
191
|
+
return json.dumps(result, indent=4)
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
version = 1
|
|
2
|
+
revision = 2
|
|
3
|
+
requires-python = ">=3.10"
|
|
4
|
+
|
|
5
|
+
[[package]]
|
|
6
|
+
name = "certifi"
|
|
7
|
+
version = "2026.2.25"
|
|
8
|
+
source = { registry = "https://pypi.org/simple" }
|
|
9
|
+
sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" }
|
|
10
|
+
wheels = [
|
|
11
|
+
{ url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" },
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
[[package]]
|
|
15
|
+
name = "charset-normalizer"
|
|
16
|
+
version = "3.4.6"
|
|
17
|
+
source = { registry = "https://pypi.org/simple" }
|
|
18
|
+
sdist = { url = "https://files.pythonhosted.org/packages/7b/60/e3bec1881450851b087e301bedc3daa9377a4d45f1c26aa90b0b235e38aa/charset_normalizer-3.4.6.tar.gz", hash = "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6", size = 143363, upload-time = "2026-03-15T18:53:25.478Z" }
|
|
19
|
+
wheels = [
|
|
20
|
+
{ url = "https://files.pythonhosted.org/packages/e6/8c/2c56124c6dc53a774d435f985b5973bc592f42d437be58c0c92d65ae7296/charset_normalizer-3.4.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95", size = 298751, upload-time = "2026-03-15T18:50:00.003Z" },
|
|
21
|
+
{ url = "https://files.pythonhosted.org/packages/86/2a/2a7db6b314b966a3bcad8c731c0719c60b931b931de7ae9f34b2839289ee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd", size = 200027, upload-time = "2026-03-15T18:50:01.702Z" },
|
|
22
|
+
{ url = "https://files.pythonhosted.org/packages/68/f2/0fe775c74ae25e2a3b07b01538fc162737b3e3f795bada3bc26f4d4d495c/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4", size = 220741, upload-time = "2026-03-15T18:50:03.194Z" },
|
|
23
|
+
{ url = "https://files.pythonhosted.org/packages/10/98/8085596e41f00b27dd6aa1e68413d1ddda7e605f34dd546833c61fddd709/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db", size = 215802, upload-time = "2026-03-15T18:50:05.859Z" },
|
|
24
|
+
{ url = "https://files.pythonhosted.org/packages/fd/ce/865e4e09b041bad659d682bbd98b47fb490b8e124f9398c9448065f64fee/charset_normalizer-3.4.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89", size = 207908, upload-time = "2026-03-15T18:50:07.676Z" },
|
|
25
|
+
{ url = "https://files.pythonhosted.org/packages/a8/54/8c757f1f7349262898c2f169e0d562b39dcb977503f18fdf0814e923db78/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565", size = 194357, upload-time = "2026-03-15T18:50:09.327Z" },
|
|
26
|
+
{ url = "https://files.pythonhosted.org/packages/6f/29/e88f2fac9218907fc7a70722b393d1bbe8334c61fe9c46640dba349b6e66/charset_normalizer-3.4.6-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9", size = 205610, upload-time = "2026-03-15T18:50:10.732Z" },
|
|
27
|
+
{ url = "https://files.pythonhosted.org/packages/4c/c5/21d7bb0cb415287178450171d130bed9d664211fdd59731ed2c34267b07d/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7", size = 203512, upload-time = "2026-03-15T18:50:12.535Z" },
|
|
28
|
+
{ url = "https://files.pythonhosted.org/packages/a4/be/ce52f3c7fdb35cc987ad38a53ebcef52eec498f4fb6c66ecfe62cfe57ba2/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550", size = 195398, upload-time = "2026-03-15T18:50:14.236Z" },
|
|
29
|
+
{ url = "https://files.pythonhosted.org/packages/81/a0/3ab5dd39d4859a3555e5dadfc8a9fa7f8352f8c183d1a65c90264517da0e/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0", size = 221772, upload-time = "2026-03-15T18:50:15.581Z" },
|
|
30
|
+
{ url = "https://files.pythonhosted.org/packages/04/6e/6a4e41a97ba6b2fa87f849c41e4d229449a586be85053c4d90135fe82d26/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8", size = 205759, upload-time = "2026-03-15T18:50:17.047Z" },
|
|
31
|
+
{ url = "https://files.pythonhosted.org/packages/db/3b/34a712a5ee64a6957bf355b01dc17b12de457638d436fdb05d01e463cd1c/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0", size = 216938, upload-time = "2026-03-15T18:50:18.44Z" },
|
|
32
|
+
{ url = "https://files.pythonhosted.org/packages/cb/05/5bd1e12da9ab18790af05c61aafd01a60f489778179b621ac2a305243c62/charset_normalizer-3.4.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b", size = 210138, upload-time = "2026-03-15T18:50:19.852Z" },
|
|
33
|
+
{ url = "https://files.pythonhosted.org/packages/bd/8e/3cb9e2d998ff6b21c0a1860343cb7b83eba9cdb66b91410e18fc4969d6ab/charset_normalizer-3.4.6-cp310-cp310-win32.whl", hash = "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557", size = 144137, upload-time = "2026-03-15T18:50:21.505Z" },
|
|
34
|
+
{ url = "https://files.pythonhosted.org/packages/d8/8f/78f5489ffadb0db3eb7aff53d31c24531d33eb545f0c6f6567c25f49a5ff/charset_normalizer-3.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6", size = 154244, upload-time = "2026-03-15T18:50:22.81Z" },
|
|
35
|
+
{ url = "https://files.pythonhosted.org/packages/e4/74/e472659dffb0cadb2f411282d2d76c60da1fc94076d7fffed4ae8a93ec01/charset_normalizer-3.4.6-cp310-cp310-win_arm64.whl", hash = "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058", size = 143312, upload-time = "2026-03-15T18:50:24.074Z" },
|
|
36
|
+
{ url = "https://files.pythonhosted.org/packages/62/28/ff6f234e628a2de61c458be2779cb182bc03f6eec12200d4a525bbfc9741/charset_normalizer-3.4.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e", size = 293582, upload-time = "2026-03-15T18:50:25.454Z" },
|
|
37
|
+
{ url = "https://files.pythonhosted.org/packages/1c/b7/b1a117e5385cbdb3205f6055403c2a2a220c5ea80b8716c324eaf75c5c95/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9", size = 197240, upload-time = "2026-03-15T18:50:27.196Z" },
|
|
38
|
+
{ url = "https://files.pythonhosted.org/packages/a1/5f/2574f0f09f3c3bc1b2f992e20bce6546cb1f17e111c5be07308dc5427956/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d", size = 217363, upload-time = "2026-03-15T18:50:28.601Z" },
|
|
39
|
+
{ url = "https://files.pythonhosted.org/packages/4a/d1/0ae20ad77bc949ddd39b51bf383b6ca932f2916074c95cad34ae465ab71f/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de", size = 212994, upload-time = "2026-03-15T18:50:30.102Z" },
|
|
40
|
+
{ url = "https://files.pythonhosted.org/packages/60/ac/3233d262a310c1b12633536a07cde5ddd16985e6e7e238e9f3f9423d8eb9/charset_normalizer-3.4.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73", size = 204697, upload-time = "2026-03-15T18:50:31.654Z" },
|
|
41
|
+
{ url = "https://files.pythonhosted.org/packages/25/3c/8a18fc411f085b82303cfb7154eed5bd49c77035eb7608d049468b53f87c/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c", size = 191673, upload-time = "2026-03-15T18:50:33.433Z" },
|
|
42
|
+
{ url = "https://files.pythonhosted.org/packages/ff/a7/11cfe61d6c5c5c7438d6ba40919d0306ed83c9ab957f3d4da2277ff67836/charset_normalizer-3.4.6-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc", size = 201120, upload-time = "2026-03-15T18:50:35.105Z" },
|
|
43
|
+
{ url = "https://files.pythonhosted.org/packages/b5/10/cf491fa1abd47c02f69687046b896c950b92b6cd7337a27e6548adbec8e4/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f", size = 200911, upload-time = "2026-03-15T18:50:36.819Z" },
|
|
44
|
+
{ url = "https://files.pythonhosted.org/packages/28/70/039796160b48b18ed466fde0af84c1b090c4e288fae26cd674ad04a2d703/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef", size = 192516, upload-time = "2026-03-15T18:50:38.228Z" },
|
|
45
|
+
{ url = "https://files.pythonhosted.org/packages/ff/34/c56f3223393d6ff3124b9e78f7de738047c2d6bc40a4f16ac0c9d7a1cb3c/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398", size = 218795, upload-time = "2026-03-15T18:50:39.664Z" },
|
|
46
|
+
{ url = "https://files.pythonhosted.org/packages/e8/3b/ce2d4f86c5282191a041fdc5a4ce18f1c6bd40a5bd1f74cf8625f08d51c1/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e", size = 201833, upload-time = "2026-03-15T18:50:41.552Z" },
|
|
47
|
+
{ url = "https://files.pythonhosted.org/packages/3b/9b/b6a9f76b0fd7c5b5ec58b228ff7e85095370282150f0bd50b3126f5506d6/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed", size = 213920, upload-time = "2026-03-15T18:50:43.33Z" },
|
|
48
|
+
{ url = "https://files.pythonhosted.org/packages/ae/98/7bc23513a33d8172365ed30ee3a3b3fe1ece14a395e5fc94129541fc6003/charset_normalizer-3.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021", size = 206951, upload-time = "2026-03-15T18:50:44.789Z" },
|
|
49
|
+
{ url = "https://files.pythonhosted.org/packages/32/73/c0b86f3d1458468e11aec870e6b3feac931facbe105a894b552b0e518e79/charset_normalizer-3.4.6-cp311-cp311-win32.whl", hash = "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e", size = 143703, upload-time = "2026-03-15T18:50:46.103Z" },
|
|
50
|
+
{ url = "https://files.pythonhosted.org/packages/c6/e3/76f2facfe8eddee0bbd38d2594e709033338eae44ebf1738bcefe0a06185/charset_normalizer-3.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4", size = 153857, upload-time = "2026-03-15T18:50:47.563Z" },
|
|
51
|
+
{ url = "https://files.pythonhosted.org/packages/e2/dc/9abe19c9b27e6cd3636036b9d1b387b78c40dedbf0b47f9366737684b4b0/charset_normalizer-3.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316", size = 142751, upload-time = "2026-03-15T18:50:49.234Z" },
|
|
52
|
+
{ url = "https://files.pythonhosted.org/packages/e5/62/c0815c992c9545347aeea7859b50dc9044d147e2e7278329c6e02ac9a616/charset_normalizer-3.4.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab", size = 295154, upload-time = "2026-03-15T18:50:50.88Z" },
|
|
53
|
+
{ url = "https://files.pythonhosted.org/packages/a8/37/bdca6613c2e3c58c7421891d80cc3efa1d32e882f7c4a7ee6039c3fc951a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21", size = 199191, upload-time = "2026-03-15T18:50:52.658Z" },
|
|
54
|
+
{ url = "https://files.pythonhosted.org/packages/6c/92/9934d1bbd69f7f398b38c5dae1cbf9cc672e7c34a4adf7b17c0a9c17d15d/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2", size = 218674, upload-time = "2026-03-15T18:50:54.102Z" },
|
|
55
|
+
{ url = "https://files.pythonhosted.org/packages/af/90/25f6ab406659286be929fd89ab0e78e38aa183fc374e03aa3c12d730af8a/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff", size = 215259, upload-time = "2026-03-15T18:50:55.616Z" },
|
|
56
|
+
{ url = "https://files.pythonhosted.org/packages/4e/ef/79a463eb0fff7f96afa04c1d4c51f8fc85426f918db467854bfb6a569ce3/charset_normalizer-3.4.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5", size = 207276, upload-time = "2026-03-15T18:50:57.054Z" },
|
|
57
|
+
{ url = "https://files.pythonhosted.org/packages/f7/72/d0426afec4b71dc159fa6b4e68f868cd5a3ecd918fec5813a15d292a7d10/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0", size = 195161, upload-time = "2026-03-15T18:50:58.686Z" },
|
|
58
|
+
{ url = "https://files.pythonhosted.org/packages/bf/18/c82b06a68bfcb6ce55e508225d210c7e6a4ea122bfc0748892f3dc4e8e11/charset_normalizer-3.4.6-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a", size = 203452, upload-time = "2026-03-15T18:51:00.196Z" },
|
|
59
|
+
{ url = "https://files.pythonhosted.org/packages/44/d6/0c25979b92f8adafdbb946160348d8d44aa60ce99afdc27df524379875cb/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2", size = 202272, upload-time = "2026-03-15T18:51:01.703Z" },
|
|
60
|
+
{ url = "https://files.pythonhosted.org/packages/2e/3d/7fea3e8fe84136bebbac715dd1221cc25c173c57a699c030ab9b8900cbb7/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5", size = 195622, upload-time = "2026-03-15T18:51:03.526Z" },
|
|
61
|
+
{ url = "https://files.pythonhosted.org/packages/57/8a/d6f7fd5cb96c58ef2f681424fbca01264461336d2a7fc875e4446b1f1346/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6", size = 220056, upload-time = "2026-03-15T18:51:05.269Z" },
|
|
62
|
+
{ url = "https://files.pythonhosted.org/packages/16/50/478cdda782c8c9c3fb5da3cc72dd7f331f031e7f1363a893cdd6ca0f8de0/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d", size = 203751, upload-time = "2026-03-15T18:51:06.858Z" },
|
|
63
|
+
{ url = "https://files.pythonhosted.org/packages/75/fc/cc2fcac943939c8e4d8791abfa139f685e5150cae9f94b60f12520feaa9b/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2", size = 216563, upload-time = "2026-03-15T18:51:08.564Z" },
|
|
64
|
+
{ url = "https://files.pythonhosted.org/packages/a8/b7/a4add1d9a5f68f3d037261aecca83abdb0ab15960a3591d340e829b37298/charset_normalizer-3.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923", size = 209265, upload-time = "2026-03-15T18:51:10.312Z" },
|
|
65
|
+
{ url = "https://files.pythonhosted.org/packages/6c/18/c094561b5d64a24277707698e54b7f67bd17a4f857bbfbb1072bba07c8bf/charset_normalizer-3.4.6-cp312-cp312-win32.whl", hash = "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4", size = 144229, upload-time = "2026-03-15T18:51:11.694Z" },
|
|
66
|
+
{ url = "https://files.pythonhosted.org/packages/ab/20/0567efb3a8fd481b8f34f739ebddc098ed062a59fed41a8d193a61939e8f/charset_normalizer-3.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb", size = 154277, upload-time = "2026-03-15T18:51:13.004Z" },
|
|
67
|
+
{ url = "https://files.pythonhosted.org/packages/15/57/28d79b44b51933119e21f65479d0864a8d5893e494cf5daab15df0247c17/charset_normalizer-3.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4", size = 142817, upload-time = "2026-03-15T18:51:14.408Z" },
|
|
68
|
+
{ url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f", size = 294823, upload-time = "2026-03-15T18:51:15.755Z" },
|
|
69
|
+
{ url = "https://files.pythonhosted.org/packages/47/7b/20e809b89c69d37be748d98e84dce6820bf663cf19cf6b942c951a3e8f41/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843", size = 198527, upload-time = "2026-03-15T18:51:17.177Z" },
|
|
70
|
+
{ url = "https://files.pythonhosted.org/packages/37/a6/4f8d27527d59c039dce6f7622593cdcd3d70a8504d87d09eb11e9fdc6062/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf", size = 218388, upload-time = "2026-03-15T18:51:18.934Z" },
|
|
71
|
+
{ url = "https://files.pythonhosted.org/packages/f6/9b/4770ccb3e491a9bacf1c46cc8b812214fe367c86a96353ccc6daf87b01ec/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8", size = 214563, upload-time = "2026-03-15T18:51:20.374Z" },
|
|
72
|
+
{ url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9", size = 206587, upload-time = "2026-03-15T18:51:21.807Z" },
|
|
73
|
+
{ url = "https://files.pythonhosted.org/packages/7e/70/3def227f1ec56f5c69dfc8392b8bd63b11a18ca8178d9211d7cc5e5e4f27/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88", size = 194724, upload-time = "2026-03-15T18:51:23.508Z" },
|
|
74
|
+
{ url = "https://files.pythonhosted.org/packages/58/ab/9318352e220c05efd31c2779a23b50969dc94b985a2efa643ed9077bfca5/charset_normalizer-3.4.6-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84", size = 202956, upload-time = "2026-03-15T18:51:25.239Z" },
|
|
75
|
+
{ url = "https://files.pythonhosted.org/packages/75/13/f3550a3ac25b70f87ac98c40d3199a8503676c2f1620efbf8d42095cfc40/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd", size = 201923, upload-time = "2026-03-15T18:51:26.682Z" },
|
|
76
|
+
{ url = "https://files.pythonhosted.org/packages/1b/db/c5c643b912740b45e8eec21de1bbab8e7fc085944d37e1e709d3dcd9d72f/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c", size = 195366, upload-time = "2026-03-15T18:51:28.129Z" },
|
|
77
|
+
{ url = "https://files.pythonhosted.org/packages/5a/67/3b1c62744f9b2448443e0eb160d8b001c849ec3fef591e012eda6484787c/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194", size = 219752, upload-time = "2026-03-15T18:51:29.556Z" },
|
|
78
|
+
{ url = "https://files.pythonhosted.org/packages/f6/98/32ffbaf7f0366ffb0445930b87d103f6b406bc2c271563644bde8a2b1093/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc", size = 203296, upload-time = "2026-03-15T18:51:30.921Z" },
|
|
79
|
+
{ url = "https://files.pythonhosted.org/packages/41/12/5d308c1bbe60cabb0c5ef511574a647067e2a1f631bc8634fcafaccd8293/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f", size = 215956, upload-time = "2026-03-15T18:51:32.399Z" },
|
|
80
|
+
{ url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2", size = 208652, upload-time = "2026-03-15T18:51:34.214Z" },
|
|
81
|
+
{ url = "https://files.pythonhosted.org/packages/f1/11/897052ea6af56df3eef3ca94edafee410ca699ca0c7b87960ad19932c55e/charset_normalizer-3.4.6-cp313-cp313-win32.whl", hash = "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d", size = 143940, upload-time = "2026-03-15T18:51:36.15Z" },
|
|
82
|
+
{ url = "https://files.pythonhosted.org/packages/a1/5c/724b6b363603e419829f561c854b87ed7c7e31231a7908708ac086cdf3e2/charset_normalizer-3.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389", size = 154101, upload-time = "2026-03-15T18:51:37.876Z" },
|
|
83
|
+
{ url = "https://files.pythonhosted.org/packages/01/a5/7abf15b4c0968e47020f9ca0935fb3274deb87cb288cd187cad92e8cdffd/charset_normalizer-3.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f", size = 143109, upload-time = "2026-03-15T18:51:39.565Z" },
|
|
84
|
+
{ url = "https://files.pythonhosted.org/packages/25/6f/ffe1e1259f384594063ea1869bfb6be5cdb8bc81020fc36c3636bc8302a1/charset_normalizer-3.4.6-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8", size = 294458, upload-time = "2026-03-15T18:51:41.134Z" },
|
|
85
|
+
{ url = "https://files.pythonhosted.org/packages/56/60/09bb6c13a8c1016c2ed5c6a6488e4ffef506461aa5161662bd7636936fb1/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421", size = 199277, upload-time = "2026-03-15T18:51:42.953Z" },
|
|
86
|
+
{ url = "https://files.pythonhosted.org/packages/00/50/dcfbb72a5138bbefdc3332e8d81a23494bf67998b4b100703fd15fa52d81/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2", size = 218758, upload-time = "2026-03-15T18:51:44.339Z" },
|
|
87
|
+
{ url = "https://files.pythonhosted.org/packages/03/b3/d79a9a191bb75f5aa81f3aaaa387ef29ce7cb7a9e5074ba8ea095cc073c2/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30", size = 215299, upload-time = "2026-03-15T18:51:45.871Z" },
|
|
88
|
+
{ url = "https://files.pythonhosted.org/packages/76/7e/bc8911719f7084f72fd545f647601ea3532363927f807d296a8c88a62c0d/charset_normalizer-3.4.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db", size = 206811, upload-time = "2026-03-15T18:51:47.308Z" },
|
|
89
|
+
{ url = "https://files.pythonhosted.org/packages/e2/40/c430b969d41dda0c465aa36cc7c2c068afb67177bef50905ac371b28ccc7/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8", size = 193706, upload-time = "2026-03-15T18:51:48.849Z" },
|
|
90
|
+
{ url = "https://files.pythonhosted.org/packages/48/15/e35e0590af254f7df984de1323640ef375df5761f615b6225ba8deb9799a/charset_normalizer-3.4.6-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815", size = 202706, upload-time = "2026-03-15T18:51:50.257Z" },
|
|
91
|
+
{ url = "https://files.pythonhosted.org/packages/5e/bd/f736f7b9cc5e93a18b794a50346bb16fbfd6b37f99e8f306f7951d27c17c/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a", size = 202497, upload-time = "2026-03-15T18:51:52.012Z" },
|
|
92
|
+
{ url = "https://files.pythonhosted.org/packages/9d/ba/2cc9e3e7dfdf7760a6ed8da7446d22536f3d0ce114ac63dee2a5a3599e62/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43", size = 193511, upload-time = "2026-03-15T18:51:53.723Z" },
|
|
93
|
+
{ url = "https://files.pythonhosted.org/packages/9e/cb/5be49b5f776e5613be07298c80e1b02a2d900f7a7de807230595c85a8b2e/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0", size = 220133, upload-time = "2026-03-15T18:51:55.333Z" },
|
|
94
|
+
{ url = "https://files.pythonhosted.org/packages/83/43/99f1b5dad345accb322c80c7821071554f791a95ee50c1c90041c157ae99/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1", size = 203035, upload-time = "2026-03-15T18:51:56.736Z" },
|
|
95
|
+
{ url = "https://files.pythonhosted.org/packages/87/9a/62c2cb6a531483b55dddff1a68b3d891a8b498f3ca555fbcf2978e804d9d/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f", size = 216321, upload-time = "2026-03-15T18:51:58.17Z" },
|
|
96
|
+
{ url = "https://files.pythonhosted.org/packages/6e/79/94a010ff81e3aec7c293eb82c28f930918e517bc144c9906a060844462eb/charset_normalizer-3.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815", size = 208973, upload-time = "2026-03-15T18:51:59.998Z" },
|
|
97
|
+
{ url = "https://files.pythonhosted.org/packages/2a/57/4ecff6d4ec8585342f0c71bc03efaa99cb7468f7c91a57b105bcd561cea8/charset_normalizer-3.4.6-cp314-cp314-win32.whl", hash = "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d", size = 144610, upload-time = "2026-03-15T18:52:02.213Z" },
|
|
98
|
+
{ url = "https://files.pythonhosted.org/packages/80/94/8434a02d9d7f168c25767c64671fead8d599744a05d6a6c877144c754246/charset_normalizer-3.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f", size = 154962, upload-time = "2026-03-15T18:52:03.658Z" },
|
|
99
|
+
{ url = "https://files.pythonhosted.org/packages/46/4c/48f2cdbfd923026503dfd67ccea45c94fd8fe988d9056b468579c66ed62b/charset_normalizer-3.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e", size = 143595, upload-time = "2026-03-15T18:52:05.123Z" },
|
|
100
|
+
{ url = "https://files.pythonhosted.org/packages/31/93/8878be7569f87b14f1d52032946131bcb6ebbd8af3e20446bc04053dc3f1/charset_normalizer-3.4.6-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866", size = 314828, upload-time = "2026-03-15T18:52:06.831Z" },
|
|
101
|
+
{ url = "https://files.pythonhosted.org/packages/06/b6/fae511ca98aac69ecc35cde828b0a3d146325dd03d99655ad38fc2cc3293/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc", size = 208138, upload-time = "2026-03-15T18:52:08.239Z" },
|
|
102
|
+
{ url = "https://files.pythonhosted.org/packages/54/57/64caf6e1bf07274a1e0b7c160a55ee9e8c9ec32c46846ce59b9c333f7008/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e", size = 224679, upload-time = "2026-03-15T18:52:10.043Z" },
|
|
103
|
+
{ url = "https://files.pythonhosted.org/packages/aa/cb/9ff5a25b9273ef160861b41f6937f86fae18b0792fe0a8e75e06acb08f1d/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077", size = 223475, upload-time = "2026-03-15T18:52:11.854Z" },
|
|
104
|
+
{ url = "https://files.pythonhosted.org/packages/fc/97/440635fc093b8d7347502a377031f9605a1039c958f3cd18dcacffb37743/charset_normalizer-3.4.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f", size = 215230, upload-time = "2026-03-15T18:52:13.325Z" },
|
|
105
|
+
{ url = "https://files.pythonhosted.org/packages/cd/24/afff630feb571a13f07c8539fbb502d2ab494019492aaffc78ef41f1d1d0/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e", size = 199045, upload-time = "2026-03-15T18:52:14.752Z" },
|
|
106
|
+
{ url = "https://files.pythonhosted.org/packages/e5/17/d1399ecdaf7e0498c327433e7eefdd862b41236a7e484355b8e0e5ebd64b/charset_normalizer-3.4.6-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484", size = 211658, upload-time = "2026-03-15T18:52:16.278Z" },
|
|
107
|
+
{ url = "https://files.pythonhosted.org/packages/b5/38/16baa0affb957b3d880e5ac2144caf3f9d7de7bc4a91842e447fbb5e8b67/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7", size = 210769, upload-time = "2026-03-15T18:52:17.782Z" },
|
|
108
|
+
{ url = "https://files.pythonhosted.org/packages/05/34/c531bc6ac4c21da9ddfddb3107be2287188b3ea4b53b70fc58f2a77ac8d8/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff", size = 201328, upload-time = "2026-03-15T18:52:19.553Z" },
|
|
109
|
+
{ url = "https://files.pythonhosted.org/packages/fa/73/a5a1e9ca5f234519c1953608a03fe109c306b97fdfb25f09182babad51a7/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e", size = 225302, upload-time = "2026-03-15T18:52:21.043Z" },
|
|
110
|
+
{ url = "https://files.pythonhosted.org/packages/ba/f6/cd782923d112d296294dea4bcc7af5a7ae0f86ab79f8fefbda5526b6cfc0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659", size = 211127, upload-time = "2026-03-15T18:52:22.491Z" },
|
|
111
|
+
{ url = "https://files.pythonhosted.org/packages/0e/c5/0b6898950627af7d6103a449b22320372c24c6feda91aa24e201a478d161/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602", size = 222840, upload-time = "2026-03-15T18:52:24.113Z" },
|
|
112
|
+
{ url = "https://files.pythonhosted.org/packages/7d/25/c4bba773bef442cbdc06111d40daa3de5050a676fa26e85090fc54dd12f0/charset_normalizer-3.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407", size = 216890, upload-time = "2026-03-15T18:52:25.541Z" },
|
|
113
|
+
{ url = "https://files.pythonhosted.org/packages/35/1a/05dacadb0978da72ee287b0143097db12f2e7e8d3ffc4647da07a383b0b7/charset_normalizer-3.4.6-cp314-cp314t-win32.whl", hash = "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579", size = 155379, upload-time = "2026-03-15T18:52:27.05Z" },
|
|
114
|
+
{ url = "https://files.pythonhosted.org/packages/5d/7a/d269d834cb3a76291651256f3b9a5945e81d0a49ab9f4a498964e83c0416/charset_normalizer-3.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4", size = 169043, upload-time = "2026-03-15T18:52:28.502Z" },
|
|
115
|
+
{ url = "https://files.pythonhosted.org/packages/23/06/28b29fba521a37a8932c6a84192175c34d49f84a6d4773fa63d05f9aff22/charset_normalizer-3.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c", size = 148523, upload-time = "2026-03-15T18:52:29.956Z" },
|
|
116
|
+
{ url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl", hash = "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69", size = 61455, upload-time = "2026-03-15T18:53:23.833Z" },
|
|
117
|
+
]
|
|
118
|
+
|
|
119
|
+
[[package]]
|
|
120
|
+
name = "colorama"
|
|
121
|
+
version = "0.4.6"
|
|
122
|
+
source = { registry = "https://pypi.org/simple" }
|
|
123
|
+
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" }
|
|
124
|
+
wheels = [
|
|
125
|
+
{ 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" },
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
[[package]]
|
|
129
|
+
name = "cursefetch"
|
|
130
|
+
version = "0.2.1"
|
|
131
|
+
source = { registry = "https://pypi.org/simple" }
|
|
132
|
+
dependencies = [
|
|
133
|
+
{ name = "dacite" },
|
|
134
|
+
{ name = "packaging" },
|
|
135
|
+
{ name = "requests" },
|
|
136
|
+
{ name = "tqdm" },
|
|
137
|
+
]
|
|
138
|
+
sdist = { url = "https://files.pythonhosted.org/packages/21/4f/1ad985b9d5a35a6c84d0d609bde44ace25c086bf9200c39eed38488147d4/cursefetch-0.2.1.tar.gz", hash = "sha256:9d3fb80f8902ac433b82c73862bc18690d8bcb3ada7bc8e2917dd30085a8f03f", size = 18650, upload-time = "2026-03-26T13:24:12.964Z" }
|
|
139
|
+
wheels = [
|
|
140
|
+
{ url = "https://files.pythonhosted.org/packages/17/5a/41719041c951f4eb982b8de6799084363769d6d2f6efbe4b1787de1b63c2/cursefetch-0.2.1-py3-none-any.whl", hash = "sha256:d45bbf8b291da08536326fcc1c260f4621cbb88c28e8a03f44e03458a635c0a5", size = 6936, upload-time = "2026-03-26T13:24:11.576Z" },
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
[[package]]
|
|
144
|
+
name = "dacite"
|
|
145
|
+
version = "1.9.2"
|
|
146
|
+
source = { registry = "https://pypi.org/simple" }
|
|
147
|
+
sdist = { url = "https://files.pythonhosted.org/packages/55/a0/7ca79796e799a3e782045d29bf052b5cde7439a2bbb17f15ff44f7aacc63/dacite-1.9.2.tar.gz", hash = "sha256:6ccc3b299727c7aa17582f0021f6ae14d5de47c7227932c47fec4cdfefd26f09", size = 22420, upload-time = "2025-02-05T09:27:29.757Z" }
|
|
148
|
+
wheels = [
|
|
149
|
+
{ url = "https://files.pythonhosted.org/packages/94/35/386550fd60316d1e37eccdda609b074113298f23cef5bddb2049823fe666/dacite-1.9.2-py3-none-any.whl", hash = "sha256:053f7c3f5128ca2e9aceb66892b1a3c8936d02c686e707bee96e19deef4bc4a0", size = 16600, upload-time = "2025-02-05T09:27:24.345Z" },
|
|
150
|
+
]
|
|
151
|
+
|
|
152
|
+
[[package]]
|
|
153
|
+
name = "ftb-snbt-lib"
|
|
154
|
+
version = "0.4.1"
|
|
155
|
+
source = { registry = "https://pypi.org/simple" }
|
|
156
|
+
dependencies = [
|
|
157
|
+
{ name = "wheel" },
|
|
158
|
+
]
|
|
159
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a7/c2/e87690ee1465e2ea458f621877b6bd87b0371fbd4b9c4387d795244908bf/ftb_snbt_lib-0.4.1.tar.gz", hash = "sha256:61d8d43dde0dbb5be0258f28aa734024c8c19c6c290beeb34c7874241bccf6c3", size = 58180, upload-time = "2025-11-21T05:17:18.527Z" }
|
|
160
|
+
wheels = [
|
|
161
|
+
{ url = "https://files.pythonhosted.org/packages/11/b7/a6115919dbdc9c01bfa660902d3e7e851121887187972da97af3a44936a4/ftb_snbt_lib-0.4.1-py3-none-any.whl", hash = "sha256:e37bec6772195bd4d36e1f5d39d652725801cb114ac1233bbb859a451ec2f8e4", size = 58942, upload-time = "2025-11-21T05:17:17.617Z" },
|
|
162
|
+
]
|
|
163
|
+
|
|
164
|
+
[[package]]
|
|
165
|
+
name = "idna"
|
|
166
|
+
version = "3.11"
|
|
167
|
+
source = { registry = "https://pypi.org/simple" }
|
|
168
|
+
sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
|
|
169
|
+
wheels = [
|
|
170
|
+
{ url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
|
|
171
|
+
]
|
|
172
|
+
|
|
173
|
+
[[package]]
|
|
174
|
+
name = "packaging"
|
|
175
|
+
version = "26.0"
|
|
176
|
+
source = { registry = "https://pypi.org/simple" }
|
|
177
|
+
sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" }
|
|
178
|
+
wheels = [
|
|
179
|
+
{ url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" },
|
|
180
|
+
]
|
|
181
|
+
|
|
182
|
+
[[package]]
|
|
183
|
+
name = "requests"
|
|
184
|
+
version = "2.33.0"
|
|
185
|
+
source = { registry = "https://pypi.org/simple" }
|
|
186
|
+
dependencies = [
|
|
187
|
+
{ name = "certifi" },
|
|
188
|
+
{ name = "charset-normalizer" },
|
|
189
|
+
{ name = "idna" },
|
|
190
|
+
{ name = "urllib3" },
|
|
191
|
+
]
|
|
192
|
+
sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" }
|
|
193
|
+
wheels = [
|
|
194
|
+
{ url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" },
|
|
195
|
+
]
|
|
196
|
+
|
|
197
|
+
[[package]]
|
|
198
|
+
name = "tqdm"
|
|
199
|
+
version = "4.67.3"
|
|
200
|
+
source = { registry = "https://pypi.org/simple" }
|
|
201
|
+
dependencies = [
|
|
202
|
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
203
|
+
]
|
|
204
|
+
sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" }
|
|
205
|
+
wheels = [
|
|
206
|
+
{ url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" },
|
|
207
|
+
]
|
|
208
|
+
|
|
209
|
+
[[package]]
|
|
210
|
+
name = "translatools"
|
|
211
|
+
version = "0.1.0"
|
|
212
|
+
source = { editable = "." }
|
|
213
|
+
dependencies = [
|
|
214
|
+
{ name = "cursefetch" },
|
|
215
|
+
{ name = "dacite" },
|
|
216
|
+
{ name = "ftb-snbt-lib" },
|
|
217
|
+
]
|
|
218
|
+
|
|
219
|
+
[package.metadata]
|
|
220
|
+
requires-dist = [
|
|
221
|
+
{ name = "cursefetch", specifier = "==0.2.1" },
|
|
222
|
+
{ name = "dacite", specifier = ">=1.9.2" },
|
|
223
|
+
{ name = "ftb-snbt-lib", specifier = ">=0.4.1" },
|
|
224
|
+
]
|
|
225
|
+
|
|
226
|
+
[[package]]
|
|
227
|
+
name = "urllib3"
|
|
228
|
+
version = "2.6.3"
|
|
229
|
+
source = { registry = "https://pypi.org/simple" }
|
|
230
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" }
|
|
231
|
+
wheels = [
|
|
232
|
+
{ url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" },
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
[[package]]
|
|
236
|
+
name = "wheel"
|
|
237
|
+
version = "0.46.3"
|
|
238
|
+
source = { registry = "https://pypi.org/simple" }
|
|
239
|
+
dependencies = [
|
|
240
|
+
{ name = "packaging" },
|
|
241
|
+
]
|
|
242
|
+
sdist = { url = "https://files.pythonhosted.org/packages/89/24/a2eb353a6edac9a0303977c4cb048134959dd2a51b48a269dfc9dde00c8a/wheel-0.46.3.tar.gz", hash = "sha256:e3e79874b07d776c40bd6033f8ddf76a7dad46a7b8aa1b2787a83083519a1803", size = 60605, upload-time = "2026-01-22T12:39:49.136Z" }
|
|
243
|
+
wheels = [
|
|
244
|
+
{ url = "https://files.pythonhosted.org/packages/87/22/b76d483683216dde3d67cba61fb2444be8d5be289bf628c13fc0fd90e5f9/wheel-0.46.3-py3-none-any.whl", hash = "sha256:4b399d56c9d9338230118d705d9737a2a468ccca63d5e813e2a4fc7815d8bc4d", size = 30557, upload-time = "2026-01-22T12:39:48.099Z" },
|
|
245
|
+
]
|