hungerlib 3.0.dev5__tar.gz → 3.0.dev7__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.
- {hungerlib-3.0.dev5/src/hungerlib.egg-info → hungerlib-3.0.dev7}/PKG-INFO +1 -1
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/pyproject.toml +1 -1
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/__init__.py +4 -0
- hungerlib-3.0.dev7/src/hungerlib/datamap.py +60 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7/src/hungerlib.egg-info}/PKG-INFO +1 -1
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib.egg-info/SOURCES.txt +1 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/LICENSE +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/README.md +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/setup.cfg +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/addons/__init__.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/addons/colormap.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/addons/configloader.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/addons/mchelpers.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/addons/scheduler.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/addons/snapshot.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/addons/utils.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/api/__init__.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/api/backups.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/api/command.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/api/databases.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/api/filemanager.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/api/schedule.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/api/startup.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/messagerouter.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/panel.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/servers/__init__.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/servers/generic.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib/servers/minecraft.py +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib.egg-info/dependency_links.txt +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib.egg-info/requires.txt +0 -0
- {hungerlib-3.0.dev5 → hungerlib-3.0.dev7}/src/hungerlib.egg-info/top_level.txt +0 -0
|
@@ -9,6 +9,7 @@ except PackageNotFoundError:
|
|
|
9
9
|
# --- Core modules ---
|
|
10
10
|
from .panel import Panel
|
|
11
11
|
from .messagerouter import MessageRouter
|
|
12
|
+
from .datamap import *
|
|
12
13
|
|
|
13
14
|
# --- API endpoints ---
|
|
14
15
|
from .api.schedule import ScheduleAPI
|
|
@@ -23,6 +24,9 @@ __all__ = [
|
|
|
23
24
|
# core utilities
|
|
24
25
|
"Panel",
|
|
25
26
|
"MessageRouter",
|
|
27
|
+
"Syntax",
|
|
28
|
+
"DataMap",
|
|
29
|
+
"mapit",
|
|
26
30
|
|
|
27
31
|
# API endpoints
|
|
28
32
|
"ScheduleAPI",
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from dataclasses import dataclass, fields, is_dataclass
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class Syntax:
|
|
6
|
+
BRACES = r"\{([^{}]+)\}"
|
|
7
|
+
DOLLARS = r"\$\{([^{}]+)\}"
|
|
8
|
+
ANGLES = r"<([^<>]+)>"
|
|
9
|
+
PERCENTS = r"%([^%]+)%"
|
|
10
|
+
|
|
11
|
+
@dataclass(frozen=True)
|
|
12
|
+
class DataMap:
|
|
13
|
+
__syntax__: str = Syntax.BRACES
|
|
14
|
+
|
|
15
|
+
def as_map(self) -> dict:
|
|
16
|
+
return {
|
|
17
|
+
f.name: getattr(self, f.name)
|
|
18
|
+
for f in fields(self)
|
|
19
|
+
if f.init and f.name != "__syntax__"
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@classmethod
|
|
23
|
+
def syntax(cls) -> str:
|
|
24
|
+
return getattr(cls, "__syntax__", Syntax.BRACES)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def mapit(text: str, *maps, **runtime) -> str:
|
|
29
|
+
for m in maps:
|
|
30
|
+
# auto-instantiate dataclass classes
|
|
31
|
+
if isinstance(m, type) and is_dataclass(m):
|
|
32
|
+
m = m()
|
|
33
|
+
|
|
34
|
+
# dataclass instance to dict
|
|
35
|
+
if is_dataclass(m):
|
|
36
|
+
pattern = m.syntax()
|
|
37
|
+
dmap = m.as_map()
|
|
38
|
+
|
|
39
|
+
# colormap-like objects to dict
|
|
40
|
+
elif hasattr(m, "as_dict"):
|
|
41
|
+
pattern = Syntax.ANGLES
|
|
42
|
+
dmap = m.as_dict()
|
|
43
|
+
|
|
44
|
+
# raw dict
|
|
45
|
+
elif isinstance(m, dict):
|
|
46
|
+
pattern = runtime.get("syntax", None)
|
|
47
|
+
if not pattern:
|
|
48
|
+
continue
|
|
49
|
+
dmap = m
|
|
50
|
+
|
|
51
|
+
else:
|
|
52
|
+
continue
|
|
53
|
+
|
|
54
|
+
# apply this map's syntax only
|
|
55
|
+
def repl(match):
|
|
56
|
+
key = match.group(1)
|
|
57
|
+
return str(dmap.get(key, match.group(0)))
|
|
58
|
+
text = re.sub(pattern, repl, text)
|
|
59
|
+
|
|
60
|
+
return text
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|