appier 1.34.6__py2.py3-none-any.whl → 1.34.7__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/__init__.py CHANGED
@@ -78,7 +78,7 @@ from .asynchronous import (
78
78
  QueueManager,
79
79
  AwaitWrapper,
80
80
  CoroutineWrapper,
81
- AyncgenWrapper,
81
+ AsyncgenWrapper,
82
82
  await_wrap,
83
83
  await_yield,
84
84
  ensure_generator,
appier/async_neo.py CHANGED
@@ -92,7 +92,7 @@ class CoroutineWrapper(object):
92
92
  self._buffer.append(value)
93
93
 
94
94
 
95
- class AyncgenWrapper(object):
95
+ class AsyncgenWrapper(object):
96
96
  def __init__(self, async_iter):
97
97
  self.async_iter = async_iter
98
98
  self.current = None
@@ -149,7 +149,7 @@ def ensure_generator(value):
149
149
  if hasattr(inspect, "isasyncgen") and inspect.isasyncgen(
150
150
  value
151
151
  ): # @UndefinedVariable
152
- return True, AyncgenWrapper(value)
152
+ return True, AsyncgenWrapper(value)
153
153
 
154
154
  return False, value
155
155
 
appier/async_old.py CHANGED
@@ -179,7 +179,7 @@ class CoroutineWrapper(object):
179
179
  pass
180
180
 
181
181
 
182
- class AyncgenWrapper(object):
182
+ class AsyncgenWrapper(object):
183
183
  pass
184
184
 
185
185
 
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.34.6"
97
+ VERSION = "1.34.7"
98
98
  """ The version of the framework that is currently installed
99
99
  this value may be used for debugging/diagnostic purposes """
100
100
 
@@ -6138,7 +6138,10 @@ class App(
6138
6138
  continue
6139
6139
  if _handler[1] and not scope == _handler[1]:
6140
6140
  continue
6141
- if not json == _handler[2]:
6141
+ # if the handler has explicitly defined to handle JSON
6142
+ # contexts then it should only be used if the JSON flag
6143
+ # is also set to the same value as in the handler
6144
+ if not _handler[2] == None and not json == _handler[2]:
6142
6145
  continue
6143
6146
  handler = _handler
6144
6147
  break
appier/data.py CHANGED
@@ -204,6 +204,8 @@ class TinyAdapter(DataAdapter):
204
204
  return tinydb.TinyDB(storage=tinydb.storages.MemoryStorage)
205
205
 
206
206
  def _drop_db_json(self):
207
+ if not os.path.exists(self.file_path):
208
+ return
207
209
  os.remove(self.file_path)
208
210
 
209
211
  def _drop_db_memory(self):
appier/model.py CHANGED
@@ -354,6 +354,7 @@ class Model(legacy.with_meta(meta.Ordered, observer.Observable, *EXTRA_CLS)):
354
354
  safe=True,
355
355
  build=False,
356
356
  fill=True,
357
+ fill_safe=False,
357
358
  new=True,
358
359
  **kwargs
359
360
  ):
@@ -395,7 +396,11 @@ class Model(legacy.with_meta(meta.Ordered, observer.Observable, *EXTRA_CLS)):
395
396
  injected into the resulting instance.
396
397
  :type fill: bool
397
398
  :param fill: If the various attributes of the model should be "filled"
398
- with default values (avoiding empty values).
399
+ with default values (avoiding empty values), not going to be applied to
400
+ safe attributes.
401
+ :type fill_safe: bool
402
+ :param fill_safe: If the safe values should also be "filled" meaning that
403
+ they are initialized in a forced "way".
399
404
  :type new: bool
400
405
  :param new: In case this value is valid the resulting instance is expected
401
406
  to be considered as new meaning that no identifier attributes are set.
@@ -408,7 +413,7 @@ class Model(legacy.with_meta(meta.Ordered, observer.Observable, *EXTRA_CLS)):
408
413
  model = util.get_object() if form else dict(kwargs)
409
414
  if fill:
410
415
  model = cls.fill(model, safe=not new)
411
- instance = cls(fill=False)
416
+ instance = cls(fill=fill_safe)
412
417
  instance.apply(model, form=form, safe_a=safe)
413
418
  if build:
414
419
  cls.build(instance.model, map=False)
appier/test/data.py CHANGED
@@ -28,6 +28,8 @@ __copyright__ = "Copyright (c) 2008-2024 Hive Solutions Lda."
28
28
  __license__ = "Apache License, Version 2.0"
29
29
  """ The license for the module """
30
30
 
31
+ import os
32
+ import tempfile
31
33
  import unittest
32
34
 
33
35
  import appier
@@ -40,3 +42,11 @@ class DataTest(unittest.TestCase):
40
42
 
41
43
  self.assertEqual(type(identifier), str)
42
44
  self.assertEqual(len(identifier), 24)
45
+
46
+ def test_drop_db_missing(self):
47
+ fd, file_path = tempfile.mkstemp()
48
+ os.close(fd)
49
+ adapter = appier.TinyAdapter(file_path=file_path)
50
+ adapter.get_db()
51
+ os.remove(file_path)
52
+ adapter.drop_db()
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ # Hive Appier Framework
5
+ # Copyright (c) 2008-2024 Hive Solutions Lda.
6
+ #
7
+ # This file is part of Hive Appier Framework.
8
+ #
9
+ # Hive Appier Framework is free software: you can redistribute it and/or modify
10
+ # it under the terms of the Apache License as published by the Apache
11
+ # Foundation, either version 2.0 of the License, or (at your option) any
12
+ # later version.
13
+ #
14
+ # Hive Appier Framework is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # Apache License for more details.
18
+ #
19
+ # You should have received a copy of the Apache License along with
20
+ # Hive Appier Framework. If not, see <http://www.apache.org/licenses/>.
21
+
22
+ __author__ = "João Magalhães <joamag@hive.pt>"
23
+ """ The author(s) of the module """
24
+
25
+ __copyright__ = "Copyright (c) 2008-2024 Hive Solutions Lda."
26
+ """ The copyright for the module """
27
+
28
+ __license__ = "Apache License, Version 2.0"
29
+ """ The license for the module """
30
+
31
+ import unittest
32
+
33
+ import appier
34
+
35
+
36
+ class ErrorHandlerTest(unittest.TestCase):
37
+ def setUp(self):
38
+ self._original_handlers = appier.common.base().App._ERROR_HANDLERS
39
+ appier.common.base().App._ERROR_HANDLERS = {}
40
+ self.app = appier.App()
41
+
42
+ def tearDown(self):
43
+ self.app.unload()
44
+ appier.common.base().App._ERROR_HANDLERS = self._original_handlers
45
+
46
+ def test_basic_registration_and_call(self):
47
+ """
48
+ Decorator should register the handler and it must be invoked by
49
+ :pyfunc:`appier.App.call_error` when an exception matching the provided
50
+ error code is raised.
51
+
52
+ The error handler is a JSON handler by default, to be able to properly
53
+ handle errors in an App.
54
+ """
55
+
56
+ expected_message = "resource not found"
57
+
58
+ @appier.error_handler(404, json=True)
59
+ def not_found(_):
60
+ return expected_message
61
+
62
+ exc = appier.exceptions.NotFoundError("dummy")
63
+ result = self.app.call_error(exc, code=exc.code, scope=None, json=True)
64
+
65
+ self.assertEqual(result, expected_message)
66
+
67
+ handlers = appier.common.base().App._ERROR_HANDLERS.get(404)
68
+ self.assertNotEqual(handlers, None)
69
+ self.assertEqual(len(handlers), 1)
70
+
71
+ method, scope, json, opts, ctx, priority = handlers[0]
72
+ self.assertEqual(method, not_found)
73
+ self.assertEqual(scope, None)
74
+ self.assertEqual(json, True)
75
+ self.assertEqual(opts, None)
76
+ self.assertEqual(ctx, None)
77
+ self.assertEqual(priority, 1)
78
+
79
+ def test_web_handler(self):
80
+ """
81
+ Test that in which the error handler is a web handler by default, to be
82
+ able to properly handle errors in an WebApp, because this is a App no
83
+ handler is called.
84
+ """
85
+
86
+ expected_message = "resource not found"
87
+
88
+ @appier.error_handler(404, json=False)
89
+ def not_found(_):
90
+ return expected_message
91
+
92
+ exc = appier.exceptions.NotFoundError("dummy")
93
+ result = self.app.call_error(exc, code=exc.code, scope=None, json=True)
94
+
95
+ self.assertEqual(result, None)
96
+
97
+ handlers = appier.common.base().App._ERROR_HANDLERS.get(404)
98
+ self.assertNotEqual(handlers, None)
99
+ self.assertEqual(len(handlers), 1)
100
+
101
+ method, scope, json, opts, ctx, priority = handlers[0]
102
+ self.assertEqual(method, not_found)
103
+ self.assertEqual(scope, None)
104
+ self.assertEqual(json, False)
105
+ self.assertEqual(opts, None)
106
+ self.assertEqual(ctx, None)
107
+ self.assertEqual(priority, 1)
108
+
109
+ def test_scope_registration(self):
110
+ """
111
+ When a *scope* argument is provided, it should be stored in the handler
112
+ metadata so that the framework can later match it appropriately.
113
+
114
+ The error handler is a JSON handler by default, to be able to properly
115
+ handle errors in an App.
116
+ """
117
+
118
+ class DummyScope:
119
+ pass
120
+
121
+ @appier.error_handler(400, scope=DummyScope, json=True)
122
+ def bad_request(_):
123
+ return "bad request"
124
+
125
+ handlers = appier.common.base().App._ERROR_HANDLERS.get(400)
126
+ self.assertNotEqual(handlers, None)
127
+ self.assertEqual(len(handlers), 1)
128
+
129
+ method, scope, json, opts, ctx, priority = handlers[0]
130
+
131
+ self.assertEqual(method, bad_request)
132
+ self.assertEqual(scope, DummyScope)
133
+ self.assertEqual(json, True)
134
+ self.assertEqual(opts, None)
135
+ self.assertEqual(ctx, None)
136
+ self.assertEqual(priority, 1)
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ # Hive Appier Framework
5
+ # Copyright (c) 2008-2024 Hive Solutions Lda.
6
+ #
7
+ # This file is part of Hive Appier Framework.
8
+ #
9
+ # Hive Appier Framework is free software: you can redistribute it and/or modify
10
+ # it under the terms of the Apache License as published by the Apache
11
+ # Foundation, either version 2.0 of the License, or (at your option) any
12
+ # later version.
13
+ #
14
+ # Hive Appier Framework is distributed in the hope that it will be useful,
15
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # Apache License for more details.
18
+ #
19
+ # You should have received a copy of the Apache License along with
20
+ # Hive Appier Framework. If not, see <http://www.apache.org/licenses/>.
21
+
22
+ __author__ = "João Magalhães <joamag@hive.pt>"
23
+ """ The author(s) of the module """
24
+
25
+ __copyright__ = "Copyright (c) 2008-2024 Hive Solutions Lda."
26
+ """ The copyright for the module """
27
+
28
+ __license__ = "Apache License, Version 2.0"
29
+ """ The license for the module """
30
+
31
+ import unittest
32
+
33
+ import appier
34
+
35
+
36
+ class ExceptionHandlerTest(unittest.TestCase):
37
+ def setUp(self):
38
+ self._original_handlers = appier.common.base().App._ERROR_HANDLERS
39
+ appier.common.base().App._ERROR_HANDLERS = {}
40
+ self.app = appier.App()
41
+
42
+ def tearDown(self):
43
+ self.app.unload()
44
+ appier.common.base().App._ERROR_HANDLERS = self._original_handlers
45
+
46
+ def test_basic_registration_and_call(self):
47
+ """
48
+ Decorator should register the handler and it must be invoked by
49
+ :pyfunc:`appier.App.call_error` when an exception matching the provided
50
+ type is raised.
51
+
52
+ The exception handler is a JSON handler by default, to be able to properly
53
+ handle errors in an App.
54
+ """
55
+
56
+ expected_message = "resource not found"
57
+
58
+ @appier.exception_handler(appier.exceptions.NotFoundError, json=True)
59
+ def not_found(_):
60
+ return expected_message
61
+
62
+ exc = appier.exceptions.NotFoundError("dummy")
63
+ result = self.app.call_error(exc, code=exc.code, scope=None, json=True)
64
+
65
+ self.assertEqual(result, expected_message)
66
+
67
+ handlers = appier.common.base().App._ERROR_HANDLERS.get(
68
+ appier.exceptions.NotFoundError
69
+ )
70
+ self.assertNotEqual(handlers, None)
71
+ self.assertEqual(len(handlers), 1)
72
+
73
+ method, scope, json, opts, ctx, priority = handlers[0]
74
+ self.assertEqual(method, not_found)
75
+ self.assertEqual(scope, None)
76
+ self.assertEqual(json, True)
77
+ self.assertEqual(opts, None)
78
+ self.assertEqual(ctx, None)
79
+ self.assertEqual(priority, 1)
80
+
81
+ def test_scope_registration(self):
82
+ """
83
+ When a *scope* argument is provided, it should be stored in the handler
84
+ metadata so that the framework can later match it appropriately.
85
+
86
+ The exception handler is a JSON handler by default, to be able to properly
87
+ handle errors in an App.
88
+ """
89
+
90
+ class DummyScope:
91
+ pass
92
+
93
+ class DummyException(Exception):
94
+ code = 400
95
+
96
+ @appier.exception_handler(DummyException, scope=DummyScope, json=True)
97
+ def dummy_handler(_):
98
+ return "dummy"
99
+
100
+ handlers = appier.common.base().App._ERROR_HANDLERS.get(DummyException)
101
+ self.assertNotEqual(handlers, None)
102
+ self.assertEqual(len(handlers), 1)
103
+
104
+ method, scope, json, opts, ctx, priority = handlers[0]
105
+
106
+ self.assertEqual(method, dummy_handler)
107
+ self.assertEqual(scope, DummyScope)
108
+ self.assertEqual(json, True)
109
+ self.assertEqual(opts, None)
110
+ self.assertEqual(ctx, None)
111
+ self.assertEqual(priority, 1)
112
+
113
+ def test_web_handler(self):
114
+ """
115
+ Test that in which the exception handler is a web handler by default, to be
116
+ able to properly handle errors in an WebApp, because this is an App no
117
+ handler is called.
118
+ """
119
+
120
+ expected_message = "resource not found"
121
+
122
+ @appier.exception_handler(appier.exceptions.NotFoundError, json=False)
123
+ def not_found(_):
124
+ return expected_message
125
+
126
+ exc = appier.exceptions.NotFoundError("dummy")
127
+ result = self.app.call_error(exc, code=exc.code, scope=None, json=True)
128
+
129
+ self.assertEqual(result, None)
130
+
131
+ handlers = appier.common.base().App._ERROR_HANDLERS.get(
132
+ appier.exceptions.NotFoundError
133
+ )
134
+ self.assertNotEqual(handlers, None)
135
+ self.assertEqual(len(handlers), 1)
136
+
137
+ method, scope, json, opts, ctx, priority = handlers[0]
138
+ self.assertEqual(method, not_found)
139
+ self.assertEqual(scope, None)
140
+ self.assertEqual(json, False)
141
+ self.assertEqual(opts, None)
142
+ self.assertEqual(ctx, None)
143
+ self.assertEqual(priority, 1)
appier/test/http.py CHANGED
@@ -104,6 +104,9 @@ class HTTPTest(unittest.TestCase):
104
104
  self.assertEqual(params, dict(hello=["world"]))
105
105
 
106
106
  def test_redirect(self):
107
+ if appier.conf("NO_NETWORK", False, cast=bool):
108
+ self.skipTest("Network access is disabled")
109
+
107
110
  _data, response = appier.get(
108
111
  "https://%s/redirect-to" % self.httpbin,
109
112
  params=dict(url="https://%s/" % self.httpbin),
@@ -135,6 +138,9 @@ class HTTPTest(unittest.TestCase):
135
138
  self.assertEqual(code, 200)
136
139
 
137
140
  def test_timeout(self):
141
+ if appier.conf("NO_NETWORK", False, cast=bool):
142
+ self.skipTest("Network access is disabled")
143
+
138
144
  self.assertRaises(
139
145
  BaseException,
140
146
  lambda: appier.get(
@@ -155,6 +161,9 @@ class HTTPTest(unittest.TestCase):
155
161
  self.assertNotEqual(data, None)
156
162
 
157
163
  def test_get_f(self):
164
+ if appier.conf("NO_NETWORK", False, cast=bool):
165
+ self.skipTest("Network access is disabled")
166
+
158
167
  file = appier.get_f("https://%s/image/png" % self.httpbin)
159
168
 
160
169
  self.assertEqual(file.file_name, "default")
@@ -170,6 +179,9 @@ class HTTPTest(unittest.TestCase):
170
179
  self.assertEqual(len(file.data_b64) > 100, True)
171
180
 
172
181
  def test_generator(self):
182
+ if appier.conf("NO_NETWORK", False, cast=bool):
183
+ self.skipTest("Network access is disabled")
184
+
173
185
  def text_g(message=[b"hello", b" ", b"world"]):
174
186
  yield sum(len(value) for value in message)
175
187
  for value in message:
@@ -185,6 +197,9 @@ class HTTPTest(unittest.TestCase):
185
197
  self.assertEqual(data["data"], "hello world")
186
198
 
187
199
  def test_file(self):
200
+ if appier.conf("NO_NETWORK", False, cast=bool):
201
+ self.skipTest("Network access is disabled")
202
+
188
203
  data, response = appier.post(
189
204
  "https://%s/post" % self.httpbin,
190
205
  data=appier.legacy.BytesIO(b"hello world"),
@@ -198,6 +213,9 @@ class HTTPTest(unittest.TestCase):
198
213
  self.assertEqual(data["data"], "hello world")
199
214
 
200
215
  def test_multithread(self):
216
+ if appier.conf("NO_NETWORK", False, cast=bool):
217
+ self.skipTest("Network access is disabled")
218
+
201
219
  threads = []
202
220
  results = []
203
221
 
@@ -230,11 +248,17 @@ class HTTPTest(unittest.TestCase):
230
248
  self.assertEqual(code, 200)
231
249
 
232
250
  def test_error(self):
251
+ if appier.conf("NO_NETWORK", False, cast=bool):
252
+ self.skipTest("Network access is disabled")
253
+
233
254
  self.assertRaises(
234
255
  appier.HTTPError, lambda: appier.get("https://%s/status/404" % self.httpbin)
235
256
  )
236
257
 
237
258
  def test_invalid(self):
259
+ if appier.conf("NO_NETWORK", False, cast=bool):
260
+ self.skipTest("Network access is disabled")
261
+
238
262
  self.assertRaises(
239
263
  BaseException, lambda: appier.get("https://invalidlargedomain.org/")
240
264
  )
appier/util.py CHANGED
@@ -2145,13 +2145,13 @@ def route(url, method="GET", asynchronous=False, json=False, opts=None, priority
2145
2145
  return decorator
2146
2146
 
2147
2147
 
2148
- def error_handler(code, scope=None, json=False, opts=None, priority=1):
2148
+ def error_handler(code, scope=None, json=None, opts=None, priority=1):
2149
2149
  def decorator(function, *args, **kwargs):
2150
2150
  if is_detached(function):
2151
2151
  delay(function, *args, **kwargs)
2152
2152
  else:
2153
2153
  common.base().App.add_error(
2154
- code, function, json=json, opts=opts, priority=priority
2154
+ code, function, scope=scope, json=json, opts=opts, priority=priority
2155
2155
  )
2156
2156
  return function
2157
2157
 
@@ -2168,13 +2168,18 @@ def error_handler(code, scope=None, json=False, opts=None, priority=1):
2168
2168
  return decorator
2169
2169
 
2170
2170
 
2171
- def exception_handler(exception, scope=None, json=False, opts=None, priority=1):
2171
+ def exception_handler(exception, scope=None, json=None, opts=None, priority=1):
2172
2172
  def decorator(function, *args, **kwargs):
2173
2173
  if is_detached(function):
2174
2174
  delay(function, *args, **kwargs)
2175
2175
  else:
2176
2176
  common.base().App.add_exception(
2177
- exception, function, json=json, opts=opts, priority=priority
2177
+ exception,
2178
+ function,
2179
+ scope=scope,
2180
+ json=json,
2181
+ opts=opts,
2182
+ priority=priority,
2178
2183
  )
2179
2184
  return function
2180
2185
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: appier
3
- Version: 1.34.6
3
+ Version: 1.34.7
4
4
  Summary: Appier Framework
5
5
  Home-page: http://appier.hive.pt
6
6
  Author: Hive Solutions Lda.
@@ -1,12 +1,12 @@
1
- appier/__init__.py,sha256=-Xd1j5egjwXV6yoKAkcPVWIZEnpPK_SJTTmQjDrW93E,9413
1
+ appier/__init__.py,sha256=08H8QW5pI-hvrdOAjeNem3Z2MgVxMbsTr0lbi7UCSt0,9414
2
2
  appier/amqp.py,sha256=etYxUlfaK27Og_9FJ6qCgNLSYhnz9XgVhIhSmD2ITW4,3852
3
3
  appier/api.py,sha256=s5ZJs0tgR3wktAhLZ7Vuhbd_4lWPsGJSEx0ptkqLxvM,14369
4
4
  appier/asgi.py,sha256=XqlXJ5QEyWyZBqFU9ubEx-jNehicihKcACR4Hy2A2nE,12194
5
- appier/async_neo.py,sha256=gQpyT1-nZE6Uynh5FEmFl5kfXkxChdUsgiKgwlaNw5E,5446
6
- appier/async_old.py,sha256=m3BFqHVPCRuIZ9L2sGYhCQPEwuCNKBO2y7SKM0dbtj8,9194
5
+ appier/async_neo.py,sha256=CqeVtKczXt3SZPvi0BYLujVTeN4i-sT8P1_0JPR5aiI,5448
6
+ appier/async_old.py,sha256=83YuTmoZkLIeyNHLZusCXqxB_6onRmYdKJ-Sqd1Yi1E,9195
7
7
  appier/asynchronous.py,sha256=a1LQa3wbGMaXELhF7W71dRr1klPOj6x-ST9EInvPhtU,1757
8
8
  appier/asynchronous.pyi,sha256=5CpLkpKcUq09woMOVYwpl24Pli0A8Xu6nXoT20xDQ-o,104
9
- appier/base.py,sha256=DBXanIgava2RDTW2NbgU8NDTk-6CnoRtEgRAmxaMRHc,271387
9
+ appier/base.py,sha256=WkvvOti2s3I4dAtZuOilBzQ4zNzHO9twDmK4o7D5j8c,271615
10
10
  appier/base.pyi,sha256=CwhdTt6lVGiXsXQewN1kkISD1YRNPCUf9U8fxYUVI3E,2924
11
11
  appier/bus.py,sha256=AMC2UXlaf6rzhzlIyTHkzbfb6tdfPBiOii4lpl9AAwg,7670
12
12
  appier/bus.pyi,sha256=W6_MIBpvDq468wfT5XM2WpPuR3O49QiZMOSCdMsJWos,182
@@ -19,7 +19,7 @@ appier/compress.py,sha256=o3E-at5DjpW2s3uOljEqqfLLyPzEU9cSXHFISk0sPvA,4699
19
19
  appier/config.py,sha256=4DPhDJlb8frV2gZwLFD05mbUol7Z2-_oaeMV5oZWayw,11530
20
20
  appier/controller.py,sha256=uKzPJnz6aqibspPKf4tfJRvVMtxdDv0RFb0ivcDoepU,2285
21
21
  appier/crypt.py,sha256=Kr7Rbil8_bUp-oE_c_Wu2LRgk8nmVb9ukCHSuXE7RSc,5874
22
- appier/data.py,sha256=VIKRNME_SQGm-KzX3-FDwktWTosXAy2i92I1s1GqlGY,14696
22
+ appier/data.py,sha256=inrM-kXXsx0jLqyetXMWdBuobZbAWBH1fnShV4NcW-Y,14764
23
23
  appier/data.pyi,sha256=Er8SxhlZln9ghI4krKJnbFVajqxUVvad2_dgap_K80A,201
24
24
  appier/defines.py,sha256=47Ceno-haMlNplk4J5TRoeWM36ggr12_Qz9fkn8wrcE,10940
25
25
  appier/exceptions.py,sha256=H7teYBUSNn7-3SBGOSK7QxT6Mn--E5F2RpC8JSpiu5c,14089
@@ -36,7 +36,7 @@ appier/legacy.py,sha256=o_oJ_2lqZELZKwkvfGt0aDam6ZSZiZiL7FYygNjrDbY,15881
36
36
  appier/log.py,sha256=jhV7ub5nZwrLzY7x-tZDJfb8tcsXu-ndWxxrCspBUdU,12825
37
37
  appier/meta.py,sha256=rgBLOjD6QU9CGYsbCQS3Fy4iY14uk1-Kd8ljkfmxxzc,7168
38
38
  appier/mock.py,sha256=WoWa67rb8qV_ogToQJCdT0R-rCw9RUY24EkA4bYR1G4,5800
39
- appier/model.py,sha256=MPvR6Skn-FuPrKTLBv0l_8qfdVEUkB18bttYJzD_er8,121879
39
+ appier/model.py,sha256=KTyAdLgxhbRlIUhuFtKysblw4JRZNnAm0Pl3G1YbpSw,122125
40
40
  appier/model.pyi,sha256=Tib26mqYnNAOgsjRaov9T2CmV2pw6IJhdzMYUeN9HM4,1838
41
41
  appier/model_a.py,sha256=c6XpG4oIelXNDK0uicsZ69-f6isUgmh5-29F61PZt9c,16176
42
42
  appier/mongo.py,sha256=t-257ReqFWnEw0bQkDvS4McsPsc6AuKoQXIFHxlrOMw,10891
@@ -58,7 +58,7 @@ appier/smtp.py,sha256=5tW0dOEm03kejLoQyhRQFjgjYRd-jhb-VlhEKDb4Zn0,3434
58
58
  appier/storage.py,sha256=Qp_CMCDg85q35n9lggNVBZRWwlGrQ-nLYNj0W7Mnbec,7470
59
59
  appier/structures.py,sha256=lwAEiz4k1O4bywGcfHvOvZJusN-lUwcviihR9aZLMtY,8883
60
60
  appier/typesf.py,sha256=XIYRQ2M7ErjvjB0SAu4Rkv3aYUOmWhqfZy3sUYyHtpM,37451
61
- appier/util.py,sha256=3CceJ5SF9M53FOJf_GXyKW2Wqvy5i72kmZDqDoz18RU,86777
61
+ appier/util.py,sha256=7K_r30q-Qf1PmtrW5Vhnpm9U1sriRYnWYdQRqCeEFdo,86887
62
62
  appier/validation.py,sha256=vxb289skd7RfGEQVmpkQxYb71JdAfLu17QaKOuAAEEQ,22388
63
63
  appier/res/static/css/base.css,sha256=J9zLozd57KoslAsrsj2a42glGTObxbkrrckR-W-_f2A,6127
64
64
  appier/res/static/images/favicon.ico,sha256=fAL8DLx_0Yl6jwpRG_K6S7g3yXxr9Hyjn3JmqyU8t7U,1150
@@ -71,11 +71,13 @@ appier/test/base.py,sha256=wVNgryfbHLu8niligtDlVFgpyG4rzFuvdKDIQqm1tHg,14806
71
71
  appier/test/cache.py,sha256=WpbfgdsXfAN9Zwo0MZvATygdl-03yqsDYAWKfn4gQf0,6922
72
72
  appier/test/config.py,sha256=r34Rtzzp5X4AkB7MuwiuRi6KF0zTUpLWphymCz90FBE,3472
73
73
  appier/test/crypt.py,sha256=wXIHJjKZJe9qhKfIeGMz5PvQWYRIQVnwbKW-dwUukAo,2457
74
- appier/test/data.py,sha256=jnoJtaLiTemKsXPtKAxd-KZymtIOS96EkWRvrtbxvTU,1353
74
+ appier/test/data.py,sha256=V34Y5oFakc8R8wwYAVyXE8-gelI0_0xTKbruF-cTP3E,1628
75
+ appier/test/error_handler.py,sha256=eTTroF0T5YYeXvKrYqASMN9RlQBgoh25St2xmzR3yMA,4589
76
+ appier/test/exception_handler.py,sha256=nviy8sGuHD06tTp3MfOGyU9mQ7NKEaq3Rr-q10feew8,4853
75
77
  appier/test/exceptions.py,sha256=y2u8jGgGczc9-UipAgRQBssosbt9FNz-OGiyfS_574E,2252
76
78
  appier/test/export.py,sha256=Ou2G5CPQ-n6ip4MIV1jooIRyp5uq3IMGgmVNBIUQOoY,3119
77
79
  appier/test/graph.py,sha256=CRUTH1UJ_mvOR5n_S9gHFy-x1rkgJIT1eJqaAoWZ5uM,6266
78
- appier/test/http.py,sha256=sKr_woe4Q92ZYIBZarYsn9dGMQn8FyES8FwS-3VvUms,8236
80
+ appier/test/http.py,sha256=kJ2VC4M1B8Da7ycG7DEu0peCVGA6Mc3TGuTG1bb5kXI,9164
79
81
  appier/test/legacy.py,sha256=bPgbRjGr8-l2d9xasr7edpV7CwWjyexLA_bz1MQrsE0,5796
80
82
  appier/test/log.py,sha256=dU9b5pqygUvGUw3emVSwURKHxey6AhOwxLdsVxBzKtE,4026
81
83
  appier/test/mock.py,sha256=u_oaaTFS9blSsJWQd-gFak6HCxBYbTEx8DIGFBF9m9o,3282
@@ -92,8 +94,8 @@ appier/test/structures.py,sha256=MRjUFRlnJi-i7YGWW5y792JbJwicNvOIzVAS220tgeQ,836
92
94
  appier/test/typesf.py,sha256=KHumQFzx7wPZSCb8_mpIwobhIy2Fh_0XYviwPjXMbKI,9680
93
95
  appier/test/util.py,sha256=vfnleU3BUaqMs1mrpXjKom3V_zFOzrsjhmQ8sYp1GaQ,46668
94
96
  appier/test/validation.py,sha256=riOCsGKob1P5jnbcB5qGZ45ApimNAVS0byg9v_uUdrk,4952
95
- appier-1.34.6.dist-info/LICENSE,sha256=Pd-b5cKP4n2tFDpdx27qJSIq0d1ok0oEcGTlbtL6QMU,11560
96
- appier-1.34.6.dist-info/METADATA,sha256=pLM7760YEqICe8Lc0rPa0YhqvwDDT8I550v60njB4nI,1920
97
- appier-1.34.6.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
98
- appier-1.34.6.dist-info/top_level.txt,sha256=Z2e_Y1ya06a554WwQZkfNRiaaQxqsdaPtBzrck384Lo,7
99
- appier-1.34.6.dist-info/RECORD,,
97
+ appier-1.34.7.dist-info/LICENSE,sha256=Pd-b5cKP4n2tFDpdx27qJSIq0d1ok0oEcGTlbtL6QMU,11560
98
+ appier-1.34.7.dist-info/METADATA,sha256=1K9LBt53P9O7UOcwWfh9X3TezynolwVRHeADzXf-xao,1920
99
+ appier-1.34.7.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
100
+ appier-1.34.7.dist-info/top_level.txt,sha256=Z2e_Y1ya06a554WwQZkfNRiaaQxqsdaPtBzrck384Lo,7
101
+ appier-1.34.7.dist-info/RECORD,,