clear-skies 1.22.3__py3-none-any.whl → 1.22.5__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.22.3
3
+ Version: 1.22.5
4
4
  Summary: A framework for building backends in the cloud
5
5
  Home-page: https://github.com/cmancone/clearskies
6
6
  License: MIT
@@ -45,9 +45,9 @@ clearskies/autodoc/schema/number.py,sha256=aw1UcA2fdgWL8ao8mbpgd5DgI50c9hli9U8GJ
45
45
  clearskies/autodoc/schema/object.py,sha256=GJ5zLw2CzhezQiNuIhVgRyk0esXqfHD5fxZrcn3tUow,383
46
46
  clearskies/autodoc/schema/password.py,sha256=Ptj8OeddAL4h69KWqZ6ubZ2awR13xdDIrNe2N0T1jic,196
47
47
  clearskies/autodoc/schema/string.py,sha256=oxZPCxYYhWnNHdbtwD3QuniStbj8XbBBpDTFXgPR1VU,244
48
- clearskies/backends/__init__.py,sha256=IqIpTNdA0U14wFNBkotwc9kZr_mMw3ry8LnldOZ0HLs,755
48
+ clearskies/backends/__init__.py,sha256=ATNzuDYREx-VBWemPmG95FR8EzO2X0--7tkErUuF9Qc,832
49
49
  clearskies/backends/api_backend.py,sha256=PQyT00pMtZZUQhfWySzVbXZ2GpycO93CRKVOmUFeo10,15073
50
- clearskies/backends/api_get_only_backend.py,sha256=OWXdoaSaF5fWb7GN1OgkGED3edKfoeOBMHc8bKtm2ig,3885
50
+ clearskies/backends/api_get_only_backend.py,sha256=KfFF72l31KBK--90lIkDqE5gcTnolSkShUqNaaWZ_gc,1690
51
51
  clearskies/backends/backend.py,sha256=fkL-De0MUdzcS2JG_spSUQZIVL9oRFvaL6SP26JPpcI,7399
52
52
  clearskies/backends/cursor_backend.py,sha256=VntlPS6z6bnZOC3XRJ-WFf5gK3pFUhH_qJpnZn8hl9U,11278
53
53
  clearskies/backends/example_backend.py,sha256=jVpv0LZpNUEJGko0XqioLkHmZHbCW6M4YyNvzKlZcDw,1413
@@ -183,7 +183,7 @@ clearskies/input_requirements/unique.py,sha256=gpbm9uoXcy8WCHsuWqAotwockbjDfJOWi
183
183
  clearskies/mocks/__init__.py,sha256=T68OUB9gGCX0WoisGzsY3Bt2cCFX7ILHKPqi6XKTJM0,113
184
184
  clearskies/mocks/input_output.py,sha256=2wD5GbUyVSkXcBg1GTZ-Oz9VzcYxNHfTlmZAODW-7CI,3898
185
185
  clearskies/mocks/models.py,sha256=DCzsnMddBvPoBA8JwwbSOhzY7enQWrosgeYD4gx2deI,5124
186
- clearskies/model.py,sha256=N5el03awXEfTBfhqjS3Yuc6ozMjATs7cMLs_IoZNuaE,13511
186
+ clearskies/model.py,sha256=FBaKfbBhtBMfl0IE1Ak4aLtXZUF7pXTbuZb7B1lXu5o,13535
187
187
  clearskies/models.py,sha256=XlNeCu6tGhyAzJ-z9cOX9PXusogljLqgZACtFiL-RnM,13037
188
188
  clearskies/secrets/__init__.py,sha256=ctTmA_etV9G_5U21APWENI1HvThrBS4DidGWRtEDHQs,1053
189
189
  clearskies/secrets/additional_configs/__init__.py,sha256=cFCrbtKF5nuR061S2y1iKZp349x-y8Srdwe3VZbfSFU,1119
@@ -207,7 +207,7 @@ clearskies/tests/simple_api/models/__init__.py,sha256=nUA0W6fgXw_Bxa9CudkaDkC80t
207
207
  clearskies/tests/simple_api/models/status.py,sha256=PEhPbaQh5qdUNHp8O0gz91LOLENAEBtqSaHxUPXchaM,699
208
208
  clearskies/tests/simple_api/models/user.py,sha256=5_P4Tp1tTdX7PkMJ__epPM5MA7JAeVYGas69vcWloLc,819
209
209
  clearskies/tests/simple_api/users_api.py,sha256=KYXCgEofDxHeRdQK67txN5oYUPvxxmB8JTku7L-apk4,2344
210
- clear_skies-1.22.3.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
211
- clear_skies-1.22.3.dist-info/METADATA,sha256=YtXu3sQzPtg-LoA92QMTlV0R6cQEuzkO_e5AXs_1JVw,1817
212
- clear_skies-1.22.3.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
213
- clear_skies-1.22.3.dist-info/RECORD,,
210
+ clear_skies-1.22.5.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
211
+ clear_skies-1.22.5.dist-info/METADATA,sha256=m0sHB05V1f3Ycu36lkX0mO-ATFw65r19aStxwb74Mls,1817
212
+ clear_skies-1.22.5.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
213
+ clear_skies-1.22.5.dist-info/RECORD,,
@@ -1,5 +1,6 @@
1
1
  from .. import binding_config
2
2
  from .api_backend import ApiBackend
3
+ from .api_get_only_backend import ApiGetOnlyBackend
3
4
  from .backend import Backend
4
5
  from .cursor_backend import CursorBackend
5
6
  from .example_backend import ExampleBackend
@@ -16,6 +17,7 @@ def example_backend(data):
16
17
 
17
18
  __all__ = [
18
19
  "ApiBackend",
20
+ "ApiGetOnlyBackend",
19
21
  "Backend",
20
22
  "CursorBackend",
21
23
  "ExampleBackend",
@@ -1,6 +1,5 @@
1
1
  from .api_backend import ApiBackend
2
- from typing import Any, Callable, Dict, List, Tuple
3
- from .. import model
2
+ from typing import Any, Dict
4
3
 
5
4
 
6
5
  class ApiGetOnlyBackend(ApiBackend):
@@ -18,84 +17,32 @@ class ApiGetOnlyBackend(ApiBackend):
18
17
  def __init__(self, requests):
19
18
  self._requests = requests
20
19
 
21
- def configure(self, auth=None, origin=None, id_column_name="id"):
20
+ def configure(self, auth=None, origin="", id_column_name="id"):
22
21
  self._auth = auth
23
22
  self._origin = origin
24
23
  self._id_column_name = id_column_name
25
24
 
26
25
  def records_url(self, configuration):
26
+ if not len(configuration["wheres"]):
27
+ raise ValueError(
28
+ f"When using the {self.__class__.__name__} backend, you must search the model by the id column. A records request was executed but no search conditions were found."
29
+ )
27
30
  record_id = None
28
31
  for where in configuration["wheres"]:
29
- if where["column"] == "id":
32
+ if where["column"] == self._id_column_name:
30
33
  record_id = where["values"][0]
31
- if record_id:
32
- return self.auth_origin + configuration["table_name"].strip("/") + f"/{record_id}"
33
- return self.auth_origin + configuration["table_name"].strip("/") + "/search"
34
+ if not record_id:
35
+ raise ValueError(
36
+ f"When using the {self.__class__.__name__} backend, you must search by the id column ('{self._id_column_name}'). A records request was executed but there was no condition set for the '{self._id_column_name}' column"
37
+ )
34
38
 
35
- def delete_url(self, id: str, model: model.Model) -> str:
36
- table_name = model.table_name().rstrip("/")
37
- return f"{table_name}/{id}"
38
-
39
- def update_url(self, id: str, model: model.Model) -> str:
40
- table_name = model.table_name().rstrip("/")
41
- return f"{table_name}/{id}"
42
-
43
- def create_url(self, data: Dict[str, Any], model: model.Model) -> str:
44
- return model.table_name().rstrip("/")
39
+ return self._origin + configuration["table_name"].strip("/") + f"/{record_id}"
45
40
 
46
41
  def records_method(self, configuration: Dict[str, Any]) -> str:
47
- return "POST"
48
-
49
- def count_method(self, configuration: Dict[str, Any]) -> str:
50
- return "POST"
51
-
52
- def _build_delete_request(self, id, model):
53
- data = model.data
54
- (url, data) = self._finalize_url_and_data(self.delete_url(id, model), data)
55
- return [url, self.delete_method(id, model), {}, {}]
56
-
57
- def _build_count_request(self, configuration):
58
- [url, method, json_data, headers] = super()._build_count_request(configuration)
59
- json_data["count_only"] = True
60
- return [url, method, json_data, headers]
61
-
62
- def records(self, configuration, model, next_page_data={}):
63
- configuration = self._check_query_configuration(configuration)
64
- [url, method, json_data, headers] = self._build_records_request(configuration)
65
- response = self._execute_request(url, method, json=json_data, headers=headers).json()
66
- records = self._map_records_response(response)
67
- for next_page_key in ["nextPage", "NextPage", "next_page"]:
68
- if response.get("pagination", {}).get(next_page_key):
69
- for key, value in response["pagination"][next_page_key].items():
70
- next_page_data[key] = value
71
- return records
72
-
73
- def _as_post_data(self, configuration):
74
- data = {
75
- "where": list(
76
- map(lambda where: self._where_for_post(where, configuration["model_columns"]), configuration["wheres"])
77
- ),
78
- "sort": configuration["sorts"],
79
- "start": configuration["pagination"].get("start", 0),
80
- "limit": configuration["limit"],
81
- }
82
- return {key: value for (key, value) in data.items() if value}
83
-
84
- def _where_for_post(self, where, columns):
85
- prefix = ""
86
- if where.get("table"):
87
- prefix = where["table"] + "."
88
- return {
89
- "column": prefix + where["column"],
90
- "operator": where["operator"],
91
- "value": self.normalize_outgoing_value(where, columns, where["values"][0]),
92
- }
42
+ return "GET"
93
43
 
94
- def normalize_outgoing_value(self, where, columns, value):
95
- column_name = where["column"]
96
- if where.get("table") or column_name not in columns:
97
- return value
98
- normalized_data = self.column_to_backend(columns[column_name], {column_name: value})
99
- if column_name in normalized_data:
100
- return normalized_data[column_name]
101
- return value
44
+ def _map_records_response(self, json):
45
+ response = super()._map_records_response(json)
46
+ if isinstance(response, dict):
47
+ return [response]
48
+ return response
clearskies/model.py CHANGED
@@ -267,9 +267,10 @@ class Model(Models):
267
267
  backend_data = {**data}
268
268
  temporary_data = {}
269
269
  for column in columns.values():
270
- if column.is_temporary and column.name in backend_data:
271
- temporary_data[column.name] = backend_data[column.name]
272
- del backend_data[column.name]
270
+ if column.is_temporary:
271
+ if column.name in backend_data:
272
+ temporary_data[column.name] = backend_data[column.name]
273
+ del backend_data[column.name]
273
274
  continue
274
275
 
275
276
  backend_data = self._backend.column_to_backend(column, backend_data)