clear-skies 1.19.26__py3-none-any.whl → 1.19.28__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.26
3
+ Version: 1.19.28
4
4
  Summary: A framework for building backends in the cloud
5
5
  Home-page: https://github.com/cmancone/clearskies
6
6
  License: MIT
@@ -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=QHEFFd3wRXvaOR7uZk-bpVLlLoTiN3D4S8sBU9rFwCE,4330
58
+ clearskies/column_types/__init__.py,sha256=u9M34F9t5jsCHpE-_6MpoSqFh3WJyfHe8wF9UlMzFj0,4464
59
59
  clearskies/column_types/audit.py,sha256=smgAnDzNS5n3_1ESeyqn6KDv_1k6gOYRqrFb8S2_TrQ,9143
60
60
  clearskies/column_types/belongs_to.py,sha256=tH1tbTOfjifSNuVjO-KbMF7GiUIoLfcDItrrS3TGGM8,11044
61
61
  clearskies/column_types/boolean.py,sha256=1yyM1CUfgD84pPE65c1OP1Qjf_J0Z45hjPrDR51AUkQ,1878
@@ -77,6 +77,7 @@ clearskies/column_types/integer.py,sha256=dGIluusPmhLRNg7PplOJLbQI2AXojqRBUHt8ek
77
77
  clearskies/column_types/json.py,sha256=TbZkdwCoZYhbALUxof2jENGfaq2i5TlcyBcmo7XzDGQ,652
78
78
  clearskies/column_types/many_to_many.py,sha256=Yu5wmMkVqRteMrH_8uSZK-bM_IrfDyv6AFb92iJ1FZs,11984
79
79
  clearskies/column_types/many_to_many_with_data.py,sha256=NOYjZedeLIWVyDV4BTRyNmhkNHZzx6SkHLFbL-VqHQU,7769
80
+ clearskies/column_types/phone.py,sha256=aUKshuknqcklA0LhUAdIgCslmAXXnWtXln1q5js8Eh8,1611
80
81
  clearskies/column_types/select.py,sha256=1oBslTJ_7QCjlFeEcwJVRL-ED4sXwCESVFRAOonvG2I,297
81
82
  clearskies/column_types/string.py,sha256=XbHC31TmlW0k86cvdVJBDyowU8Xis6Te6R0rPLXgLpI,863
82
83
  clearskies/column_types/updated.py,sha256=FNyRK-PS6lgFQ9QN2VrcIZP2g5EHGhll6pf-MgqMH7s,566
@@ -154,7 +155,7 @@ clearskies/handlers/simple_search.py,sha256=bSfq8rzdqkBj-dTGUBSZ1EkfjzUWHID7mKD2
154
155
  clearskies/handlers/update.py,sha256=rx8HW87Pfh95e_9nEfKKnxfkh2HBlCUdYqVwljtXiJ8,4116
155
156
  clearskies/handlers/write.py,sha256=Gu1w1PQ1F7tlqCqALorMRek3UH6IkViPIO195dxPd8k,9372
156
157
  clearskies/input_outputs/__init__.py,sha256=mQWL-u41FRTrPGuHe8FhLmcHjAEaUxjFwUf7RgDcbAs,182
157
- clearskies/input_outputs/cli.py,sha256=F54wues9cNESE8FhQP3mDWrgrZyFouDIN-ZZ3-KJjks,6258
158
+ clearskies/input_outputs/cli.py,sha256=DCoSHn2fd7cwi4-3eZU_M0-Txk85PQNB1x6D_B50f1M,6529
158
159
  clearskies/input_outputs/exceptions/__init__.py,sha256=bc5Tc1XBZnqA1fKbk7pk5hyx102vqx3sDE19E03xGk4,82
159
160
  clearskies/input_outputs/exceptions/cli_input_error.py,sha256=kOFU8aLTLmeTL_AKDshxMu8_ufildg6p8ndhE1xHfb0,41
160
161
  clearskies/input_outputs/exceptions/cli_not_found.py,sha256=JBBuZA9ZwdkPhd3a0qaGgEPQrxh1fehy4R3ZaV2gWXU,39
@@ -202,7 +203,7 @@ clearskies/tests/simple_api/models/__init__.py,sha256=nUA0W6fgXw_Bxa9CudkaDkC80t
202
203
  clearskies/tests/simple_api/models/status.py,sha256=PEhPbaQh5qdUNHp8O0gz91LOLENAEBtqSaHxUPXchaM,699
203
204
  clearskies/tests/simple_api/models/user.py,sha256=5_P4Tp1tTdX7PkMJ__epPM5MA7JAeVYGas69vcWloLc,819
204
205
  clearskies/tests/simple_api/users_api.py,sha256=KYXCgEofDxHeRdQK67txN5oYUPvxxmB8JTku7L-apk4,2344
205
- clear_skies-1.19.26.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
206
- clear_skies-1.19.26.dist-info/METADATA,sha256=7D3m8KlUwjEfQoW2lEAaKTUgJW2-wlLkS_Qd0pCJ3qQ,1712
207
- clear_skies-1.19.26.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
208
- clear_skies-1.19.26.dist-info/RECORD,,
206
+ clear_skies-1.19.28.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
207
+ clear_skies-1.19.28.dist-info/METADATA,sha256=SuWSER8vAnHiEAmLYsCs4P3r5no1Eva8_y_U9WQbFW0,1712
208
+ clear_skies-1.19.28.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
209
+ clear_skies-1.19.28.dist-info/RECORD,,
@@ -19,6 +19,7 @@ from .integer import Integer
19
19
  from .json import JSON
20
20
  from .many_to_many import ManyToMany
21
21
  from .many_to_many_with_data import ManyToManyWithData
22
+ from .phone import Phone
22
23
  from .select import Select
23
24
  from .string import String
24
25
  from .updated import Updated
@@ -110,6 +111,10 @@ def many_to_many_with_data(name, **kwargs):
110
111
  return build_column_config(name, ManyToManyWithData, **kwargs)
111
112
 
112
113
 
114
+ def phone(name, **kwargs):
115
+ return build_column_config(name, Phone, **kwargs)
116
+
117
+
113
118
  def select(name, **kwargs):
114
119
  return build_column_config(name, Select, **kwargs)
115
120
 
@@ -171,6 +176,8 @@ __all__ = [
171
176
  "ManyToMany",
172
177
  "many_to_many_with_data",
173
178
  "ManyToManyWithData",
179
+ "phone",
180
+ "Phone",
174
181
  "select",
175
182
  "Select",
176
183
  "string",
@@ -0,0 +1,48 @@
1
+ from .string import String
2
+ import re
3
+
4
+
5
+ class Phone(String):
6
+ my_configs = [
7
+ "usa_only",
8
+ ]
9
+
10
+ def __init__(self, di):
11
+ super().__init__(di)
12
+
13
+ def to_backend(self, data):
14
+ if self.name not in data:
15
+ return data
16
+
17
+ # phone numbers are stored as only digits.
18
+ return {**data, **{self.name: re.sub(r"\D", "", data[self.name])}}
19
+
20
+ def input_error_for_value(self, value, operator=None):
21
+ if type(value) != str:
22
+ return f"Value must be a string for {self.name}"
23
+
24
+ # we'll allow spaces, dashes, parenthesis, dashes, and plus signs.
25
+ # if there is anything else then it's not a valid phone number.
26
+ # However, we don't do more detailed validation, because I'm too lazy to
27
+ # figure out what is and is not a valid phone number, especially when
28
+ # you get to the world of international numbers.
29
+ if re.search(r"[^\d \-()+]", value):
30
+ return "Invalid phone number"
31
+
32
+ # for some final validation (especially US numbers) work only with the digits.
33
+ value = re.sub(r"\D", "", value)
34
+
35
+ if len(value) > 15:
36
+ return "Invalid phone number"
37
+
38
+ # we can't be too short unless we're doing a fuzzy search
39
+ if len(value) < 10 and operator and operator.lower() != "like":
40
+ return "Invalid phone number"
41
+
42
+ if self.config("usa_only", silent=True):
43
+ if len(value) > 11:
44
+ return "Invalid phone number"
45
+ if value[0] == "1" and len(value) != 11:
46
+ return "Invalid phone number"
47
+
48
+ return ""
@@ -13,6 +13,7 @@ class CLI:
13
13
  _body_loaded_as_json = None
14
14
  _body_as_json = None
15
15
  _routing_data = None
16
+ _authorization_data = None
16
17
 
17
18
  def __init__(self, sys):
18
19
  self._sys = sys
@@ -20,6 +21,7 @@ class CLI:
20
21
  self._kwargs = {}
21
22
  self._request_method = None
22
23
  self._parse_args(self._sys.argv)
24
+ self._authorization_data = None
23
25
 
24
26
  def respond(self, response, status_code=200):
25
27
  if status_code == 404:
@@ -172,3 +174,9 @@ class CLI:
172
174
 
173
175
  def get_client_ip(self):
174
176
  return "cli"
177
+
178
+ def set_authorization_data(self, data):
179
+ self._authorization_data = data
180
+
181
+ def get_authorization_data(self):
182
+ return self._authorization_data if self._authorization_data else {}