clear-skies 1.19.29__py3-none-any.whl → 1.19.31__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.

Potentially problematic release.


This version of clear-skies might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: clear-skies
3
- Version: 1.19.29
3
+ Version: 1.19.31
4
4
  Summary: A framework for building backends in the cloud
5
5
  Home-page: https://github.com/cmancone/clearskies
6
6
  License: MIT
@@ -44,7 +44,7 @@ clearskies/autodoc/schema/number.py,sha256=aw1UcA2fdgWL8ao8mbpgd5DgI50c9hli9U8GJ
44
44
  clearskies/autodoc/schema/object.py,sha256=GJ5zLw2CzhezQiNuIhVgRyk0esXqfHD5fxZrcn3tUow,383
45
45
  clearskies/autodoc/schema/password.py,sha256=Ptj8OeddAL4h69KWqZ6ubZ2awR13xdDIrNe2N0T1jic,196
46
46
  clearskies/autodoc/schema/string.py,sha256=oxZPCxYYhWnNHdbtwD3QuniStbj8XbBBpDTFXgPR1VU,244
47
- clearskies/backends/__init__.py,sha256=3pvJw5dUnrqt7vyeBFjkHbycUEGkEpoYKxZoJwUVZO0,711
47
+ clearskies/backends/__init__.py,sha256=IqIpTNdA0U14wFNBkotwc9kZr_mMw3ry8LnldOZ0HLs,755
48
48
  clearskies/backends/api_backend.py,sha256=vcGYub4G3jLLstTDkMMnZkID9JQz-qHmKNapgde4gSc,8875
49
49
  clearskies/backends/backend.py,sha256=fkL-De0MUdzcS2JG_spSUQZIVL9oRFvaL6SP26JPpcI,7399
50
50
  clearskies/backends/cursor_backend.py,sha256=VntlPS6z6bnZOC3XRJ-WFf5gK3pFUhH_qJpnZn8hl9U,11278
@@ -55,7 +55,7 @@ clearskies/backends/memory_backend.py,sha256=6Ts_NtP9S_QisvpNcQKO0CUqhCRAuL3d5LZ
55
55
  clearskies/backends/restful_api_advanced_search_backend.py,sha256=uiR4SEKhLNmczYJEAkVMIdPWxQc4YWSp-_WzcSL7DEo,5480
56
56
  clearskies/backends/secrets_backend.py,sha256=4lzrgdL_O_pgCT5HknV2gotFgp9GzjQ5_2n0-4H4kvs,2204
57
57
  clearskies/binding_config.py,sha256=bF8LBNEgJacwKCqToAtDqN9hv5omzU7zt_4qB9KPtE0,457
58
- clearskies/column_types/__init__.py,sha256=u9M34F9t5jsCHpE-_6MpoSqFh3WJyfHe8wF9UlMzFj0,4464
58
+ clearskies/column_types/__init__.py,sha256=Z3HVDZeleZJQNnIrhQbvhzI09-v2ADNw0PQFYkoUwvE,4588
59
59
  clearskies/column_types/audit.py,sha256=2YcrZVVElpOUdmxYTQ_6CshL1HVou6fz65dOOs_b8Gw,9659
60
60
  clearskies/column_types/belongs_to.py,sha256=tH1tbTOfjifSNuVjO-KbMF7GiUIoLfcDItrrS3TGGM8,11044
61
61
  clearskies/column_types/boolean.py,sha256=1yyM1CUfgD84pPE65c1OP1Qjf_J0Z45hjPrDR51AUkQ,1878
@@ -80,6 +80,7 @@ clearskies/column_types/many_to_many_with_data.py,sha256=NOYjZedeLIWVyDV4BTRyNmh
80
80
  clearskies/column_types/phone.py,sha256=aUKshuknqcklA0LhUAdIgCslmAXXnWtXln1q5js8Eh8,1611
81
81
  clearskies/column_types/select.py,sha256=1oBslTJ_7QCjlFeEcwJVRL-ED4sXwCESVFRAOonvG2I,297
82
82
  clearskies/column_types/string.py,sha256=XbHC31TmlW0k86cvdVJBDyowU8Xis6Te6R0rPLXgLpI,863
83
+ clearskies/column_types/timestamp.py,sha256=XQ8SHKrvPbgaXWlGP_1dKn9sYOFbcGVuSmGjWnTVTl8,2820
83
84
  clearskies/column_types/updated.py,sha256=FNyRK-PS6lgFQ9QN2VrcIZP2g5EHGhll6pf-MgqMH7s,566
84
85
  clearskies/column_types/updated_micro.py,sha256=3geqsV4nsPB9xDKyvQDGniU-KMqM8WvoqHfUYcBqGJY,587
85
86
  clearskies/column_types/uuid.py,sha256=pA6Cd-1QSRuUpz0PxWAGRdG01hW7bpIicOhhJvAvDkQ,711
@@ -203,7 +204,7 @@ clearskies/tests/simple_api/models/__init__.py,sha256=nUA0W6fgXw_Bxa9CudkaDkC80t
203
204
  clearskies/tests/simple_api/models/status.py,sha256=PEhPbaQh5qdUNHp8O0gz91LOLENAEBtqSaHxUPXchaM,699
204
205
  clearskies/tests/simple_api/models/user.py,sha256=5_P4Tp1tTdX7PkMJ__epPM5MA7JAeVYGas69vcWloLc,819
205
206
  clearskies/tests/simple_api/users_api.py,sha256=KYXCgEofDxHeRdQK67txN5oYUPvxxmB8JTku7L-apk4,2344
206
- clear_skies-1.19.29.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
207
- clear_skies-1.19.29.dist-info/METADATA,sha256=_9U68Hm392uXjqQs-x5bGay9azxktjOnXlxfs_LIsbk,1712
208
- clear_skies-1.19.29.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
209
- clear_skies-1.19.29.dist-info/RECORD,,
207
+ clear_skies-1.19.31.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
208
+ clear_skies-1.19.31.dist-info/METADATA,sha256=J3n3vqiDQIaaf0i6Q5pTTsumlb_1D0_iR0ai2iHDzwU,1712
209
+ clear_skies-1.19.31.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
210
+ clear_skies-1.19.31.dist-info/RECORD,,
@@ -1,5 +1,6 @@
1
1
  from .. import binding_config
2
2
  from .api_backend import ApiBackend
3
+ from .backend import Backend
3
4
  from .cursor_backend import CursorBackend
4
5
  from .example_backend import ExampleBackend
5
6
  from .file_backend import FileBackend
@@ -15,6 +16,7 @@ def example_backend(data):
15
16
 
16
17
  __all__ = [
17
18
  "ApiBackend",
19
+ "Backend",
18
20
  "CursorBackend",
19
21
  "ExampleBackend",
20
22
  "example_backend",
@@ -22,6 +22,7 @@ from .many_to_many_with_data import ManyToManyWithData
22
22
  from .phone import Phone
23
23
  from .select import Select
24
24
  from .string import String
25
+ from .timestamp import Timestamp
25
26
  from .updated import Updated
26
27
  from .updated_micro import UpdatedMicro
27
28
  from .uuid import UUID
@@ -123,6 +124,10 @@ def string(name, **kwargs):
123
124
  return build_column_config(name, String, **kwargs)
124
125
 
125
126
 
127
+ def timestamp(name, **kwargs):
128
+ return build_column_config(name, Timestamp, **kwargs)
129
+
130
+
126
131
  def updated(name, **kwargs):
127
132
  return build_column_config(name, Updated, **kwargs)
128
133
 
@@ -0,0 +1,72 @@
1
+ from .datetime import DateTime
2
+ from datetime import datetime, timezone
3
+ import dateparser
4
+ from ..autodoc.schema import DateTime as AutoDocDateTime
5
+
6
+
7
+ class Timestamp(DateTime):
8
+ my_configs = [
9
+ "date_format",
10
+ "milliseconds",
11
+ ]
12
+
13
+ def _finalize_configuration(self, configuration):
14
+ return {
15
+ **{
16
+ "date_format": self._date_format,
17
+ "milliseconds": False,
18
+ },
19
+ **super()._finalize_configuration(configuration),
20
+ }
21
+
22
+ def from_backend(self, value):
23
+ mult = 1000 if self.config("milliseconds") else 1
24
+ if not value:
25
+ date = None
26
+ elif isinstance(value, str):
27
+ if not value.isdigit():
28
+ raise ValueError(
29
+ f"Invalid data was found in the backend for model {self.model_class.__name__} and column {self.name}: a string value was found that is not a timestamp. It was '{value}'"
30
+ )
31
+ date = datetime.fromtimestamp(int(value) / mult)
32
+ elif isinstance(value, int):
33
+ date = datetime.fromtimestamp(value / mult)
34
+ else:
35
+ if not isinstance(value, datetime):
36
+ raise ValueError(
37
+ f"Invalid data was found in the backend for model {self.model_class.__name__} and column {self.name}: the value was neither an integer, a string, nor a datetime object"
38
+ )
39
+ date = value
40
+ return date.replace(tzinfo=timezone.utc) if date else None
41
+
42
+ def to_backend(self, data):
43
+ if not self.name in data or isinstance(data[self.name], int) or data[self.name] == None:
44
+ return data
45
+
46
+ value = data[self.name]
47
+ if isinstance(value, str):
48
+ if not value.isdigit():
49
+ raise ValueError(
50
+ f"Invalid data was sent to the backend for model {self.model_class.__name__} and column {self.name}: a string value was found that is not a timestamp. It was '{value}'"
51
+ )
52
+ value = int(value)
53
+ elif isinstance(value, datetime):
54
+ value = value.timestamp()
55
+ else:
56
+ raise ValueError(
57
+ f"Invalid data was sent to the backend for model {self.model_class.__name__} and column {self.name}: the value was neither an integer, a string, nor a datetime object"
58
+ )
59
+
60
+ # hopefully this is a Python datetime object in UTC timezone...
61
+ return {**data, **{self.name: value}}
62
+
63
+ def input_error_for_value(self, value, operator=None):
64
+ if not isinstance(value, int):
65
+ return f"'{self.name}' must be an integer"
66
+ return ""
67
+
68
+ def values_match(self, value_1, value_2):
69
+ """
70
+ Compares two values to see if they are the same
71
+ """
72
+ return value_1 == value_2