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.
@@ -0,0 +1,3 @@
1
+ class AsyncManager: ...
2
+ class SimpleManager(AsyncManager): ...
3
+ class QueueManager(AsyncManager): ...
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.2"
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
@@ -0,0 +1,8 @@
1
+ from threading import Thread
2
+
3
+ from .component import Component
4
+
5
+ class Bus(Component): ...
6
+ class MemoryBus(Bus): ...
7
+ class RedisBus(Bus): ...
8
+ class RedisListener(Thread): ...
appier/cache.pyi ADDED
@@ -0,0 +1,7 @@
1
+ from .component import Component
2
+
3
+ class Cache(Component): ...
4
+ class MemoryCache(Cache): ...
5
+ class FileCache(Cache): ...
6
+ class RedisCache(Cache): ...
7
+ class SerializedCache: ...
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
@@ -0,0 +1,6 @@
1
+ class DataAdapter: ...
2
+ class MongoAdapter(DataAdapter): ...
3
+ class TinyAdapter(DataAdapter): ...
4
+ class Collection: ...
5
+ class MongoCollection(Collection): ...
6
+ class TinyCollection(Collection): ...
appier/legacy.py CHANGED
@@ -30,9 +30,9 @@ __license__ = "Apache License, Version 2.0"
30
30
 
31
31
  import os
32
32
  import sys
33
+ import inspect
33
34
  import calendar
34
35
  import datetime
35
- import inspect
36
36
  import functools
37
37
  import itertools
38
38
  import contextlib
appier/log.py CHANGED
@@ -241,6 +241,7 @@ class BaseFormatter(logging.Formatter):
241
241
  thread=record.thread,
242
242
  process=record.process,
243
243
  logger=record.name,
244
+ meta=getattr(record, "meta", None),
244
245
  )
245
246
  )
246
247
  record._wrapped = True
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
- handler and handler(_model.model)
468
- build and cls.build(_model.model, map=False)
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
- build and cls.build(_copy.model, map=False, rules=rules)
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 and self._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
@@ -0,0 +1,6 @@
1
+ from .component import Component
2
+
3
+ class Preferences(Component): ...
4
+ class MemoryPreferences(Preferences): ...
5
+ class FilePreferences(Preferences): ...
6
+ class RedisPreferences(Preferences): ...
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
@@ -0,0 +1,7 @@
1
+ class Session: ...
2
+ class MockSession(Session): ...
3
+ class DataSession(Session): ...
4
+ class MemorySession(DataSession): ...
5
+ class FileSession(DataSession): ...
6
+ class RedisSession(DataSession): ...
7
+ class ClientSession(DataSession): ...
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: appier
3
- Version: 1.33.2
3
+ Version: 1.33.3
4
4
  Summary: Appier Framework
5
5
  Home-page: http://appier.hive.pt
6
6
  Author: Hive Solutions Lda.
@@ -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/base.py,sha256=6ZXt3Z63zXHkEYkxuDa_knYY44VjJMoxumDKEJ6H640,269068
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=-A50nM3bTfmDXWscVsN-6suo6UJq-WLlFosmFEUtH-g,10296
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=2ldRfzwQg6SQXp9dC8q7pl6-aNBAQ0AdeF_2rllcYeE,15881
30
- appier/log.py,sha256=QJR4lLkVe6olbsY9lrVB78-1WGMxATzLA-Y9slE_XIk,12772
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=S3Qn5R36EKZFomf52A49Qmf3oEVwA0ciP_BSqSrOGSc,121790
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=ured3diixEYrfGEbwNP89MkCkBbYepWEmxB4Nkuraeo,2358
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.2.dist-info/LICENSE,sha256=Pd-b5cKP4n2tFDpdx27qJSIq0d1ok0oEcGTlbtL6QMU,11560
85
- appier-1.33.2.dist-info/METADATA,sha256=lmp3zTy2LDLj2RK9EoV8IhO_jCMausvZE1-DlL19Z2Q,1920
86
- appier-1.33.2.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
87
- appier-1.33.2.dist-info/top_level.txt,sha256=Z2e_Y1ya06a554WwQZkfNRiaaQxqsdaPtBzrck384Lo,7
88
- appier-1.33.2.dist-info/RECORD,,
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,,