appier 1.33.2__py2.py3-none-any.whl → 1.33.3__py2.py3-none-any.whl
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.
- appier/asynchronous.pyi +3 -0
- appier/base.py +1 -1
- appier/base.pyi +85 -0
- appier/bus.pyi +8 -0
- appier/cache.pyi +7 -0
- appier/component.pyi +1 -0
- appier/config.py +49 -0
- appier/data.pyi +6 -0
- appier/legacy.py +1 -1
- appier/log.py +1 -0
- appier/model.py +8 -6
- appier/model.pyi +48 -0
- appier/part.pyi +1 -0
- appier/preferences.pyi +6 -0
- appier/scheduler.pyi +70 -0
- appier/session.pyi +7 -0
- appier/test/config.py +36 -0
- {appier-1.33.2.dist-info → appier-1.33.3.dist-info}/METADATA +1 -1
- {appier-1.33.2.dist-info → appier-1.33.3.dist-info}/RECORD +22 -11
- {appier-1.33.2.dist-info → appier-1.33.3.dist-info}/LICENSE +0 -0
- {appier-1.33.2.dist-info → appier-1.33.3.dist-info}/WHEEL +0 -0
- {appier-1.33.2.dist-info → appier-1.33.3.dist-info}/top_level.txt +0 -0
appier/asynchronous.pyi
ADDED
appier/base.py
CHANGED
|
@@ -94,7 +94,7 @@ NAME = "appier"
|
|
|
94
94
|
""" The name to be used to describe the framework while working
|
|
95
95
|
on its own environment, this is just a descriptive value """
|
|
96
96
|
|
|
97
|
-
VERSION = "1.33.
|
|
97
|
+
VERSION = "1.33.3"
|
|
98
98
|
""" The version of the framework that is currently installed
|
|
99
99
|
this value may be used for debugging/diagnostic purposes """
|
|
100
100
|
|
appier/base.pyi
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
from os import PathLike
|
|
2
|
+
from logging import Handler
|
|
3
|
+
from typing import Sequence, Type
|
|
4
|
+
|
|
5
|
+
from .bus import Bus
|
|
6
|
+
from .part import Part
|
|
7
|
+
from .cache import Cache
|
|
8
|
+
from .data import DataAdapter
|
|
9
|
+
from .session import Session
|
|
10
|
+
from .preferences import Preferences
|
|
11
|
+
from .asynchronous import AsyncManager
|
|
12
|
+
from .scheduler import SchedulerTask, JobFunction, Cron
|
|
13
|
+
|
|
14
|
+
class App:
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
name: str | None = ...,
|
|
18
|
+
locales: Sequence[str] = ...,
|
|
19
|
+
parts: Sequence[Type[Part]] = ...,
|
|
20
|
+
level: str | int | None = ...,
|
|
21
|
+
handlers: Sequence[Handler] | None = ...,
|
|
22
|
+
service: bool = ...,
|
|
23
|
+
safe: bool = ...,
|
|
24
|
+
lazy: bool = ...,
|
|
25
|
+
payload: bool = ...,
|
|
26
|
+
cache_s: int = ...,
|
|
27
|
+
cache_c: Type[Cache] = ...,
|
|
28
|
+
preferences_c: Type[Preferences] = ...,
|
|
29
|
+
bus_c: Type[Bus] = ...,
|
|
30
|
+
session_c: Type[Session] = ...,
|
|
31
|
+
adapter_c: Type[DataAdapter] = ...,
|
|
32
|
+
manager_c: Type[AsyncManager] = ...,
|
|
33
|
+
): ...
|
|
34
|
+
def start(self, refresh: bool = ...): ...
|
|
35
|
+
def stop(self, refresh: bool = ...): ...
|
|
36
|
+
def serve(
|
|
37
|
+
self,
|
|
38
|
+
server: str = ...,
|
|
39
|
+
host: str = ...,
|
|
40
|
+
port: int = ...,
|
|
41
|
+
ipv6: bool = ...,
|
|
42
|
+
ssl: bool = ...,
|
|
43
|
+
key_file: PathLike[str] | None = ...,
|
|
44
|
+
cer_file: PathLike[str] | None = ...,
|
|
45
|
+
backlog: int = ...,
|
|
46
|
+
threaded: bool = ...,
|
|
47
|
+
conf: bool = ...,
|
|
48
|
+
**kwargs
|
|
49
|
+
): ...
|
|
50
|
+
def template(
|
|
51
|
+
self,
|
|
52
|
+
template: Template | PathLike[str] | str,
|
|
53
|
+
content_type: str = ...,
|
|
54
|
+
templates_path: PathLike[str] | str | None = ...,
|
|
55
|
+
cache: bool = ...,
|
|
56
|
+
detached: bool = ...,
|
|
57
|
+
locale: str | None = ...,
|
|
58
|
+
asynchronous: bool = ...,
|
|
59
|
+
**kwargs
|
|
60
|
+
) -> str: ...
|
|
61
|
+
def cron(self, job: JobFunction, cron: Cron) -> SchedulerTask: ...
|
|
62
|
+
def url_for(
|
|
63
|
+
self,
|
|
64
|
+
type: str,
|
|
65
|
+
filename: str | None = ...,
|
|
66
|
+
prefix: str | None = ...,
|
|
67
|
+
query: str | None = ...,
|
|
68
|
+
params: str | None = ...,
|
|
69
|
+
absolute: bool = ...,
|
|
70
|
+
touch: bool = ...,
|
|
71
|
+
session: bool = ...,
|
|
72
|
+
compress: str | None = ...,
|
|
73
|
+
base_url: str | None = ...,
|
|
74
|
+
*args,
|
|
75
|
+
**kwargs
|
|
76
|
+
) -> str | None: ...
|
|
77
|
+
...
|
|
78
|
+
|
|
79
|
+
class APIApp(App): ...
|
|
80
|
+
class WebApp(App): ...
|
|
81
|
+
class Template: ...
|
|
82
|
+
|
|
83
|
+
def get_app() -> App: ...
|
|
84
|
+
def get_name() -> str | None: ...
|
|
85
|
+
def get_base_path() -> PathLike[str] | None: ...
|
appier/bus.pyi
ADDED
appier/cache.pyi
ADDED
appier/component.pyi
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class Component: ...
|
appier/config.py
CHANGED
|
@@ -172,6 +172,7 @@ def load(names=(FILE_NAME,), path=None, encoding="utf-8", ctx=None):
|
|
|
172
172
|
for path in paths:
|
|
173
173
|
for name in names:
|
|
174
174
|
load_file(name=name, path=path, encoding=encoding, ctx=ctx)
|
|
175
|
+
load_dot_env(ctx=ctx)
|
|
175
176
|
load_env(ctx=ctx)
|
|
176
177
|
|
|
177
178
|
|
|
@@ -218,6 +219,54 @@ def load_file(name=FILE_NAME, path=None, encoding="utf-8", ctx=None):
|
|
|
218
219
|
configs[key] = value
|
|
219
220
|
|
|
220
221
|
|
|
222
|
+
def load_dot_env(name=".env", encoding="utf-8", ctx=None):
|
|
223
|
+
configs = ctx["configs"] if ctx else CONFIGS
|
|
224
|
+
config_f = ctx["config_f"] if ctx else CONFIG_F
|
|
225
|
+
|
|
226
|
+
file_path = os.path.abspath(name)
|
|
227
|
+
file_path = os.path.normpath(file_path)
|
|
228
|
+
|
|
229
|
+
exists = os.path.exists(file_path)
|
|
230
|
+
if not exists:
|
|
231
|
+
return
|
|
232
|
+
|
|
233
|
+
exists = file_path in config_f
|
|
234
|
+
if exists:
|
|
235
|
+
config_f.remove(file_path)
|
|
236
|
+
config_f.append(file_path)
|
|
237
|
+
|
|
238
|
+
file = open(file_path, "rb")
|
|
239
|
+
try:
|
|
240
|
+
data = file.read()
|
|
241
|
+
finally:
|
|
242
|
+
file.close()
|
|
243
|
+
if not data:
|
|
244
|
+
return
|
|
245
|
+
|
|
246
|
+
data = data.decode(encoding)
|
|
247
|
+
data = data.strip()
|
|
248
|
+
lines = data.splitlines()
|
|
249
|
+
lines = [line.strip() for line in lines]
|
|
250
|
+
|
|
251
|
+
for line in lines:
|
|
252
|
+
line = line.strip()
|
|
253
|
+
if not line:
|
|
254
|
+
continue
|
|
255
|
+
if line.startswith("#"):
|
|
256
|
+
continue
|
|
257
|
+
key, value = line.split("=", 1)
|
|
258
|
+
key = key.strip()
|
|
259
|
+
value = value.strip()
|
|
260
|
+
if (
|
|
261
|
+
value.startswith('"')
|
|
262
|
+
and value.endswith('"')
|
|
263
|
+
or value.startswith("'")
|
|
264
|
+
and value.endswith("'")
|
|
265
|
+
):
|
|
266
|
+
value = value[1:-1].replace('\\"', '"')
|
|
267
|
+
configs[key] = value
|
|
268
|
+
|
|
269
|
+
|
|
221
270
|
def load_env(ctx=None):
|
|
222
271
|
configs = ctx["configs"] if ctx else CONFIGS
|
|
223
272
|
|
appier/data.pyi
ADDED
appier/legacy.py
CHANGED
appier/log.py
CHANGED
appier/model.py
CHANGED
|
@@ -464,8 +464,10 @@ class Model(legacy.with_meta(meta.Ordered, observer.Observable, *EXTRA_CLS)):
|
|
|
464
464
|
if not isinstance(model, dict):
|
|
465
465
|
continue
|
|
466
466
|
_model = cls(model=model, **kwargs)
|
|
467
|
-
|
|
468
|
-
|
|
467
|
+
if handler:
|
|
468
|
+
handler(_model.model)
|
|
469
|
+
if build:
|
|
470
|
+
cls.build(_model.model, map=False)
|
|
469
471
|
wrapping.append(_model)
|
|
470
472
|
if is_sequence:
|
|
471
473
|
return wrapping
|
|
@@ -2361,7 +2363,8 @@ class Model(legacy.with_meta(meta.Ordered, observer.Observable, *EXTRA_CLS)):
|
|
|
2361
2363
|
def copy(self, build=False, rules=True):
|
|
2362
2364
|
cls = self.__class__
|
|
2363
2365
|
_copy = copy.deepcopy(self)
|
|
2364
|
-
|
|
2366
|
+
if build:
|
|
2367
|
+
cls.build(_copy.model, map=False, rules=rules)
|
|
2365
2368
|
return _copy
|
|
2366
2369
|
|
|
2367
2370
|
def clone(self, reset=True, deep=False):
|
|
@@ -2466,9 +2469,8 @@ class Model(legacy.with_meta(meta.Ordered, observer.Observable, *EXTRA_CLS)):
|
|
|
2466
2469
|
# should ensure that the model is ready to be saved in the
|
|
2467
2470
|
# data source, without corruption of it, only run this process
|
|
2468
2471
|
# in case the validate flag is correctly set
|
|
2469
|
-
validate
|
|
2470
|
-
pre_validate=pre_validate, post_validate=post_validate
|
|
2471
|
-
)
|
|
2472
|
+
if validate:
|
|
2473
|
+
self._validate(pre_validate=pre_validate, post_validate=post_validate)
|
|
2472
2474
|
|
|
2473
2475
|
# calls the complete set of event handlers for the current
|
|
2474
2476
|
# save operation, this should trigger changes in the model
|
appier/model.pyi
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
from typing import Callable, Self, Sequence
|
|
2
|
+
from .base import App
|
|
3
|
+
|
|
4
|
+
class Model:
|
|
5
|
+
owner: App
|
|
6
|
+
|
|
7
|
+
@classmethod
|
|
8
|
+
def singleton(
|
|
9
|
+
cls,
|
|
10
|
+
model: Self | None = ...,
|
|
11
|
+
form: bool = ...,
|
|
12
|
+
safe: bool = ...,
|
|
13
|
+
build: bool = ...,
|
|
14
|
+
*args,
|
|
15
|
+
**kwargs
|
|
16
|
+
) -> Self | None: ...
|
|
17
|
+
@classmethod
|
|
18
|
+
def get(cls, *args, **kwargs) -> Self | None: ...
|
|
19
|
+
@classmethod
|
|
20
|
+
def find(cls, *args, **kwargs) -> Sequence[Self]: ...
|
|
21
|
+
@classmethod
|
|
22
|
+
def validate(cls) -> list[Callable]: ...
|
|
23
|
+
@classmethod
|
|
24
|
+
def _name(cls) -> str: ...
|
|
25
|
+
def save(
|
|
26
|
+
self,
|
|
27
|
+
validate: bool = ...,
|
|
28
|
+
verify: bool = ...,
|
|
29
|
+
is_new: bool | None = ...,
|
|
30
|
+
increment_a: bool | None = ...,
|
|
31
|
+
immutables_a: bool | None = ...,
|
|
32
|
+
pre_validate: bool = ...,
|
|
33
|
+
pre_save: bool = ...,
|
|
34
|
+
pre_create: bool = ...,
|
|
35
|
+
pre_update: bool = ...,
|
|
36
|
+
post_validate: bool = ...,
|
|
37
|
+
post_save: bool = ...,
|
|
38
|
+
post_create: bool = ...,
|
|
39
|
+
post_update: bool = ...,
|
|
40
|
+
before_callbacks: Sequence[Callable[[Self], None]] = ...,
|
|
41
|
+
after_callbacks: Sequence[Callable[[Self], None]] = ...,
|
|
42
|
+
) -> Self: ...
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
class Field:
|
|
46
|
+
def __init__(self, *args, **kwargs): ...
|
|
47
|
+
|
|
48
|
+
field = Field
|
appier/part.pyi
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class Part: ...
|
appier/preferences.pyi
ADDED
appier/scheduler.pyi
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from logging import Logger
|
|
3
|
+
from threading import Thread
|
|
4
|
+
from typing import Callable
|
|
5
|
+
|
|
6
|
+
from .base import App
|
|
7
|
+
|
|
8
|
+
LOOP_TIMEOUT: float = ...
|
|
9
|
+
|
|
10
|
+
JobFunction = Callable[[], None]
|
|
11
|
+
Cron = str | SchedulerDate
|
|
12
|
+
CronField = str | int | list | tuple
|
|
13
|
+
|
|
14
|
+
class Scheduler(Thread):
|
|
15
|
+
owner: App | None
|
|
16
|
+
timeout: float
|
|
17
|
+
daemon: bool
|
|
18
|
+
|
|
19
|
+
def __init__(self, owner: App | None, timeout: float = ..., daemon: bool = ...): ...
|
|
20
|
+
def run(self): ...
|
|
21
|
+
def stop(self): ...
|
|
22
|
+
def tick(self): ...
|
|
23
|
+
def load(self): ...
|
|
24
|
+
def awake(self): ...
|
|
25
|
+
@property
|
|
26
|
+
def logger(self) -> Logger: ...
|
|
27
|
+
|
|
28
|
+
class CronScheduler(Scheduler):
|
|
29
|
+
def __init__(self, owner: App | None, timeout: float = ..., daemon: bool = ...): ...
|
|
30
|
+
def tick(self, now_ts: float | None = ...): ...
|
|
31
|
+
def schedule(
|
|
32
|
+
self, job: JobFunction, cron: Cron, now: datetime | None = ...
|
|
33
|
+
) -> SchedulerTask: ...
|
|
34
|
+
def next_run(self) -> datetime | None: ...
|
|
35
|
+
def next_timestamp(self) -> float | None: ...
|
|
36
|
+
|
|
37
|
+
class SchedulerTask(object):
|
|
38
|
+
job: JobFunction
|
|
39
|
+
date: SchedulerDate
|
|
40
|
+
|
|
41
|
+
def __init__(self, job: JobFunction, cron: Cron): ...
|
|
42
|
+
def enable(self): ...
|
|
43
|
+
def disable(self): ...
|
|
44
|
+
def next_run(self, now: datetime | None = ...) -> datetime: ...
|
|
45
|
+
def next_timestamp(self, now: datetime | None = ...) -> float: ...
|
|
46
|
+
@property
|
|
47
|
+
def enabled(self) -> bool: ...
|
|
48
|
+
|
|
49
|
+
class SchedulerDate(object):
|
|
50
|
+
minutes: set[int]
|
|
51
|
+
hours: set[int]
|
|
52
|
+
days_of_month: set[int]
|
|
53
|
+
months: set[int]
|
|
54
|
+
days_of_week: set[int]
|
|
55
|
+
|
|
56
|
+
def __init__(
|
|
57
|
+
self,
|
|
58
|
+
minutes: CronField = ...,
|
|
59
|
+
hours: CronField = ...,
|
|
60
|
+
days_of_month: CronField = ...,
|
|
61
|
+
months: CronField = ...,
|
|
62
|
+
days_of_week: CronField = ...,
|
|
63
|
+
): ...
|
|
64
|
+
@classmethod
|
|
65
|
+
def from_cron(cls, cron: Cron) -> SchedulerDate: ...
|
|
66
|
+
def next_timestamp(self, now: datetime | None = None) -> float: ...
|
|
67
|
+
def next_run(self, now: datetime | None = None) -> datetime: ...
|
|
68
|
+
def _parse_field(
|
|
69
|
+
self, field: CronField, min_value: int, max_value: int
|
|
70
|
+
) -> set[int]: ...
|
appier/session.pyi
ADDED
appier/test/config.py
CHANGED
|
@@ -32,6 +32,11 @@ import unittest
|
|
|
32
32
|
|
|
33
33
|
import appier
|
|
34
34
|
|
|
35
|
+
try:
|
|
36
|
+
import unittest.mock as mock
|
|
37
|
+
except ImportError:
|
|
38
|
+
mock = None
|
|
39
|
+
|
|
35
40
|
|
|
36
41
|
class ConfigTest(unittest.TestCase):
|
|
37
42
|
def test_basic(self):
|
|
@@ -79,3 +84,34 @@ class ConfigTest(unittest.TestCase):
|
|
|
79
84
|
result = appier.conf("HEIGHT", cast=int)
|
|
80
85
|
|
|
81
86
|
self.assertEqual(result, None)
|
|
87
|
+
|
|
88
|
+
def test_load_dot_env(self):
|
|
89
|
+
if mock == None:
|
|
90
|
+
self.skipTest("Skipping test: mock unavailable")
|
|
91
|
+
|
|
92
|
+
mock_data = mock.mock_open(
|
|
93
|
+
read_data=b"#This is a comment\nAGE=10\nNAME=colony\n"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
with mock.patch("os.path.exists", return_value=True), mock.patch(
|
|
97
|
+
"builtins.open", mock_data, create=True
|
|
98
|
+
) as mock_open:
|
|
99
|
+
ctx = dict(configs={}, config_f=[])
|
|
100
|
+
|
|
101
|
+
appier.config.load_dot_env(".env", "utf-8", ctx)
|
|
102
|
+
|
|
103
|
+
result = appier.conf("AGE", cast=int)
|
|
104
|
+
self.assertEqual(type(result), int)
|
|
105
|
+
self.assertEqual(result, 10)
|
|
106
|
+
|
|
107
|
+
result = appier.conf("AGE", cast=str)
|
|
108
|
+
|
|
109
|
+
self.assertEqual(result, "10")
|
|
110
|
+
self.assertEqual(type(result), str)
|
|
111
|
+
|
|
112
|
+
result = appier.conf("HEIGHT", cast=int)
|
|
113
|
+
self.assertEqual(result, None)
|
|
114
|
+
|
|
115
|
+
self.assertEqual(len(ctx["configs"]), 2)
|
|
116
|
+
|
|
117
|
+
self.assertEqual(mock_open.return_value.close.call_count, 1)
|
|
@@ -5,16 +5,22 @@ appier/asgi.py,sha256=sKQH9K_QEDPbBSk3AWcvHo7Lfl5yawIo6NcM0z1qQCw,12100
|
|
|
5
5
|
appier/async_neo.py,sha256=gQpyT1-nZE6Uynh5FEmFl5kfXkxChdUsgiKgwlaNw5E,5446
|
|
6
6
|
appier/async_old.py,sha256=m3BFqHVPCRuIZ9L2sGYhCQPEwuCNKBO2y7SKM0dbtj8,9194
|
|
7
7
|
appier/asynchronous.py,sha256=a1LQa3wbGMaXELhF7W71dRr1klPOj6x-ST9EInvPhtU,1757
|
|
8
|
-
appier/
|
|
8
|
+
appier/asynchronous.pyi,sha256=5CpLkpKcUq09woMOVYwpl24Pli0A8Xu6nXoT20xDQ-o,104
|
|
9
|
+
appier/base.py,sha256=vT3x5IbHjFW1w2WHuAxRy35noZTHCS1tsZ1pGAasUv8,269068
|
|
10
|
+
appier/base.pyi,sha256=Vx8idYnMvP3nLwGdd2LJKGc0RFpT6iav77YMcBpcr4o,2515
|
|
9
11
|
appier/bus.py,sha256=AMC2UXlaf6rzhzlIyTHkzbfb6tdfPBiOii4lpl9AAwg,7670
|
|
12
|
+
appier/bus.pyi,sha256=W6_MIBpvDq468wfT5XM2WpPuR3O49QiZMOSCdMsJWos,182
|
|
10
13
|
appier/cache.py,sha256=V1nhf4aHJpUlcFtxVsd-2tGCt1BarkxvHWwVwuhc4Ao,10689
|
|
14
|
+
appier/cache.pyi,sha256=nrLCe6nAu_wLCa2juaALjPCQsNzIffrY_rb5MlGMrX0,176
|
|
11
15
|
appier/common.py,sha256=fcECBvu-KcB9DImZzkpM_FA_PUqgCx0FKP4KHuOikYc,1313
|
|
12
16
|
appier/component.py,sha256=I6xDQp0dmYOarOgbyrXIfXa1RAsVHttd8JjUub15U2M,2988
|
|
17
|
+
appier/component.pyi,sha256=zKO71mWgi7I8QapKajZHoWznrLyofHigCT4gJvDY3G8,22
|
|
13
18
|
appier/compress.py,sha256=o3E-at5DjpW2s3uOljEqqfLLyPzEU9cSXHFISk0sPvA,4699
|
|
14
|
-
appier/config.py,sha256
|
|
19
|
+
appier/config.py,sha256=C9cgAViSm9QIMVoB-0cv-u12y8rKHpVC3D7WZMRJsxM,11568
|
|
15
20
|
appier/controller.py,sha256=uKzPJnz6aqibspPKf4tfJRvVMtxdDv0RFb0ivcDoepU,2285
|
|
16
21
|
appier/crypt.py,sha256=Kr7Rbil8_bUp-oE_c_Wu2LRgk8nmVb9ukCHSuXE7RSc,5874
|
|
17
22
|
appier/data.py,sha256=VIKRNME_SQGm-KzX3-FDwktWTosXAy2i92I1s1GqlGY,14696
|
|
23
|
+
appier/data.pyi,sha256=Er8SxhlZln9ghI4krKJnbFVajqxUVvad2_dgap_K80A,201
|
|
18
24
|
appier/defines.py,sha256=47Ceno-haMlNplk4J5TRoeWM36ggr12_Qz9fkn8wrcE,10940
|
|
19
25
|
appier/exceptions.py,sha256=H7teYBUSNn7-3SBGOSK7QxT6Mn--E5F2RpC8JSpiu5c,14089
|
|
20
26
|
appier/execution.py,sha256=U0OB6DazsqfCDBJvHG6PIu3jQYKqaIoOXB8cj9Uf43I,14464
|
|
@@ -26,22 +32,27 @@ appier/geo.py,sha256=EEPh8oX7Uk7iert-XKt7HCw0swicc8lFAv7XFeQSbZ8,4877
|
|
|
26
32
|
appier/git.py,sha256=-neM2mxqlyiCNu17CpLyiz3RN7Ti6LtAx5L1tipxAGA,9785
|
|
27
33
|
appier/graph.py,sha256=jSgu-ookILujLm4ivW14SymVmuI1nbjbVZMgRS2ehOg,4054
|
|
28
34
|
appier/http.py,sha256=Xk871N8yCN39OGkm5WqQ5M9lnI9teG9t9_-A5zdVwy4,38635
|
|
29
|
-
appier/legacy.py,sha256=
|
|
30
|
-
appier/log.py,sha256=
|
|
35
|
+
appier/legacy.py,sha256=o_oJ_2lqZELZKwkvfGt0aDam6ZSZiZiL7FYygNjrDbY,15881
|
|
36
|
+
appier/log.py,sha256=jhV7ub5nZwrLzY7x-tZDJfb8tcsXu-ndWxxrCspBUdU,12825
|
|
31
37
|
appier/meta.py,sha256=rgBLOjD6QU9CGYsbCQS3Fy4iY14uk1-Kd8ljkfmxxzc,7168
|
|
32
38
|
appier/mock.py,sha256=WoWa67rb8qV_ogToQJCdT0R-rCw9RUY24EkA4bYR1G4,5800
|
|
33
|
-
appier/model.py,sha256=
|
|
39
|
+
appier/model.py,sha256=6foYOpbDkY1XFaRGQhJY7AdAz0GI3khofaQxQWZZeGM,121826
|
|
40
|
+
appier/model.pyi,sha256=IDtn69Y5HuiZYfrpydwiVVN4DOSnzO9pLSMi8Xe7DDU,1314
|
|
34
41
|
appier/model_a.py,sha256=c6XpG4oIelXNDK0uicsZ69-f6isUgmh5-29F61PZt9c,16176
|
|
35
42
|
appier/mongo.py,sha256=t-257ReqFWnEw0bQkDvS4McsPsc6AuKoQXIFHxlrOMw,10891
|
|
36
43
|
appier/observer.py,sha256=T0QpkxdkcNuEOZJdmJT5nFSJ2e-0VPbGveX5YKtt7mA,4519
|
|
37
44
|
appier/part.py,sha256=LW3ejynHMyxH-iP3dUqmPPPkFYVRPHjwNF4kR1W-_jY,4380
|
|
45
|
+
appier/part.pyi,sha256=BHClxTBbnefBTqp0npxgDYNKevFSJlKxhHDg14OLSSs,16
|
|
38
46
|
appier/preferences.py,sha256=3JrH2f8Drzw0zNTDA4MtOYMzhUaBm3Rr4d6E95mL49o,8287
|
|
47
|
+
appier/preferences.pyi,sha256=uYVgvDq2f4KWlLRY-C8bi6xry_utFKDeToGHH5aptxc,197
|
|
39
48
|
appier/queuing.py,sha256=6AJlRVdd5JunzChu8Q1U-9Biq4vQUHTuJFC8qs2wzCs,8097
|
|
40
49
|
appier/redisdb.py,sha256=5inJMQqHVkfsGoqoRGYzewlgooDZD2uwOtlPXHX17V0,3504
|
|
41
50
|
appier/request.py,sha256=vNiRdBZXgboMx_d3xkGHlJf3f7ifejgKyhYZ4Pr9GlE,31450
|
|
42
51
|
appier/scheduler.py,sha256=5BRlH5jjs594wRqpZcwlNOFSbl9cML2YdY7OKAWCtzQ,9228
|
|
52
|
+
appier/scheduler.pyi,sha256=JHqH-DSKFZL1uXJTpWFTVHykRT8QRGrVdYCi0nyhjrQ,2132
|
|
43
53
|
appier/serialize.py,sha256=LiR1ZbAiC_I3lhlQToPK_u2DC2r04Gl9OEQTayW4Rlg,6669
|
|
44
54
|
appier/session.py,sha256=6rcwFdsu--7gFLr6mJJh3EFSZ_A3Oe8u7olAvTw2sUk,20380
|
|
55
|
+
appier/session.pyi,sha256=JBYcT1wZ9mKBBk9iTw2GDJENB8PWFzxXjIr9oXKe85Q,239
|
|
45
56
|
appier/settings.py,sha256=28tTRJIZ47iwXqUs6YtUoW7ntEVsp_0-QfONVDGA1sg,1136
|
|
46
57
|
appier/smtp.py,sha256=5tW0dOEm03kejLoQyhRQFjgjYRd-jhb-VlhEKDb4Zn0,3434
|
|
47
58
|
appier/storage.py,sha256=Qp_CMCDg85q35n9lggNVBZRWwlGrQ-nLYNj0W7Mnbec,7470
|
|
@@ -58,7 +69,7 @@ appier/res/templates/layout.html.tpl,sha256=e6CVkHTtF8zlFClKFBVWJgMZQ1paHi_240pX
|
|
|
58
69
|
appier/test/__init__.py,sha256=zMHH-X-dnws-iNXL4JudfPNz1h5oeRSXeS5O5TjoyZk,990
|
|
59
70
|
appier/test/base.py,sha256=dJyWcr8egJkrjw4_p9LkUTi9GsFpL82i3lu0nJGrzcc,14857
|
|
60
71
|
appier/test/cache.py,sha256=WpbfgdsXfAN9Zwo0MZvATygdl-03yqsDYAWKfn4gQf0,6922
|
|
61
|
-
appier/test/config.py,sha256=
|
|
72
|
+
appier/test/config.py,sha256=r34Rtzzp5X4AkB7MuwiuRi6KF0zTUpLWphymCz90FBE,3472
|
|
62
73
|
appier/test/crypt.py,sha256=wXIHJjKZJe9qhKfIeGMz5PvQWYRIQVnwbKW-dwUukAo,2457
|
|
63
74
|
appier/test/data.py,sha256=jnoJtaLiTemKsXPtKAxd-KZymtIOS96EkWRvrtbxvTU,1353
|
|
64
75
|
appier/test/exceptions.py,sha256=y2u8jGgGczc9-UipAgRQBssosbt9FNz-OGiyfS_574E,2252
|
|
@@ -81,8 +92,8 @@ appier/test/structures.py,sha256=Uylzx5vLNORXKG5wsPMdIreW1SlHWGnmSQouqQNG6E8,674
|
|
|
81
92
|
appier/test/typesf.py,sha256=KHumQFzx7wPZSCb8_mpIwobhIy2Fh_0XYviwPjXMbKI,9680
|
|
82
93
|
appier/test/util.py,sha256=SSHuBAZQ0TcXLDYI0xUvmwId5nndDZb88s_5Y-Hqibw,46884
|
|
83
94
|
appier/test/validation.py,sha256=riOCsGKob1P5jnbcB5qGZ45ApimNAVS0byg9v_uUdrk,4952
|
|
84
|
-
appier-1.33.
|
|
85
|
-
appier-1.33.
|
|
86
|
-
appier-1.33.
|
|
87
|
-
appier-1.33.
|
|
88
|
-
appier-1.33.
|
|
95
|
+
appier-1.33.3.dist-info/LICENSE,sha256=Pd-b5cKP4n2tFDpdx27qJSIq0d1ok0oEcGTlbtL6QMU,11560
|
|
96
|
+
appier-1.33.3.dist-info/METADATA,sha256=yl44OIZWirSE2nbMVl6fWegMUKnleKA0JT1UGGhaxCo,1920
|
|
97
|
+
appier-1.33.3.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
|
|
98
|
+
appier-1.33.3.dist-info/top_level.txt,sha256=Z2e_Y1ya06a554WwQZkfNRiaaQxqsdaPtBzrck384Lo,7
|
|
99
|
+
appier-1.33.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|