clear-skies 1.22.27__py3-none-any.whl → 1.22.29__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.3
2
2
  Name: clear-skies
3
- Version: 1.22.27
3
+ Version: 1.22.29
4
4
  Summary: A framework for building backends in the cloud
5
5
  License: MIT
6
6
  Author: Conor Mancone
@@ -46,14 +46,14 @@ clearskies/autodoc/schema/object.py,sha256=GJ5zLw2CzhezQiNuIhVgRyk0esXqfHD5fxZrc
46
46
  clearskies/autodoc/schema/password.py,sha256=Ptj8OeddAL4h69KWqZ6ubZ2awR13xdDIrNe2N0T1jic,196
47
47
  clearskies/autodoc/schema/string.py,sha256=oxZPCxYYhWnNHdbtwD3QuniStbj8XbBBpDTFXgPR1VU,244
48
48
  clearskies/backends/__init__.py,sha256=ATNzuDYREx-VBWemPmG95FR8EzO2X0--7tkErUuF9Qc,832
49
- clearskies/backends/api_backend.py,sha256=RVf1Lr45GvL5fxRfR8cj4rFe7J_eP9ELmRyKea1N43E,15578
49
+ clearskies/backends/api_backend.py,sha256=voXp-6ZdeZWfIKbgYb3Bcql8tzwJXXRfvl_WzZR5pv0,15561
50
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
54
54
  clearskies/backends/file_backend.py,sha256=tByQdOX1pf6r9-6vRDqOnQ8teRYo0bEWk589qrg598w,1752
55
55
  clearskies/backends/json_backend.py,sha256=uDBqkekQadBm0BMoCVuzSPRB-5SjMTCDSAbuIqqwkF8,180
56
- clearskies/backends/memory_backend.py,sha256=6Ts_NtP9S_QisvpNcQKO0CUqhCRAuL3d5LZYPvSgXW4,20837
56
+ clearskies/backends/memory_backend.py,sha256=ACmnFhUO3sWJvELvhCEsBcqo2jWh8A-7iugYtjwTP9k,21338
57
57
  clearskies/backends/restful_api_advanced_search_backend.py,sha256=kBHO7wO_b24pkDXGWbGe0-5efQkkXjP6NQ3EaHC9V-k,3716
58
58
  clearskies/backends/secrets_backend.py,sha256=4lzrgdL_O_pgCT5HknV2gotFgp9GzjQ5_2n0-4H4kvs,2204
59
59
  clearskies/binding_config.py,sha256=bF8LBNEgJacwKCqToAtDqN9hv5omzU7zt_4qB9KPtE0,457
@@ -148,7 +148,7 @@ clearskies/handlers/exceptions/not_found.py,sha256=xThOXiMfyYBaI2bhfOhpVoZ_vdw1h
148
148
  clearskies/handlers/get.py,sha256=x9SogDd2ZvIYwv2UkNa_FUmmKMNd9XPadkbnBKbyTGo,6892
149
149
  clearskies/handlers/health_check.py,sha256=m6H3psUql-I7hZao3fsxjrZnCjFJZ1ROTF-41g8Syww,2078
150
150
  clearskies/handlers/input_processing.py,sha256=edtG6NQJZCte0Nq-j7SUMzp6vxgIIbLxeUGscWOALAs,3814
151
- clearskies/handlers/list.py,sha256=RdhvcVA4ZgkdmOHl6iGBC-2jPhjYay0_kFHttmVoq9Q,25466
151
+ clearskies/handlers/list.py,sha256=ojnDsOkMk8MBs6zaOPg73sVniv_3jiYNm5_OKJxuUi8,25516
152
152
  clearskies/handlers/mygrations.py,sha256=4iKpJKooqgNtAURwMl_FgsXUt8OYOaG_TY1OV1llQxY,2759
153
153
  clearskies/handlers/request_method_routing.py,sha256=DgPEz3tgbaUkXHsOriPbIctfSf4Gm4NxfRdVulH91Kg,1636
154
154
  clearskies/handlers/restful_api.py,sha256=1rJ2REX1sTAdbqaRuCclP375agrho4zNNQx6hXGa4nQ,9258
@@ -208,7 +208,7 @@ clearskies/tests/simple_api/models/__init__.py,sha256=nUA0W6fgXw_Bxa9CudkaDkC80t
208
208
  clearskies/tests/simple_api/models/status.py,sha256=PEhPbaQh5qdUNHp8O0gz91LOLENAEBtqSaHxUPXchaM,699
209
209
  clearskies/tests/simple_api/models/user.py,sha256=5_P4Tp1tTdX7PkMJ__epPM5MA7JAeVYGas69vcWloLc,819
210
210
  clearskies/tests/simple_api/users_api.py,sha256=KYXCgEofDxHeRdQK67txN5oYUPvxxmB8JTku7L-apk4,2344
211
- clear_skies-1.22.27.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
212
- clear_skies-1.22.27.dist-info/METADATA,sha256=_F_I6SW9XdWb810gQAj81yFsccOu8csIoinyvh273Ww,1842
213
- clear_skies-1.22.27.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
214
- clear_skies-1.22.27.dist-info/RECORD,,
211
+ clear_skies-1.22.29.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
212
+ clear_skies-1.22.29.dist-info/METADATA,sha256=WQ_iGdlvNrhtS-ZnF8BgXO3BIYccsx8hmCWQkDubNc8,1842
213
+ clear_skies-1.22.29.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
214
+ clear_skies-1.22.29.dist-info/RECORD,,
@@ -98,7 +98,7 @@ class ApiBackend(Backend):
98
98
  return [url, self.update_method(id, model), data, {}]
99
99
 
100
100
  def _map_update_response(self, json):
101
- if not "data" in json:
101
+ if "data" not in json:
102
102
  raise ValueError("Unexpected API response to update request")
103
103
  return json["data"]
104
104
 
@@ -112,7 +112,7 @@ class ApiBackend(Backend):
112
112
  return [url, self.create_method(data, model), data, {}]
113
113
 
114
114
  def _map_create_response(self, json):
115
- if not "data" in json:
115
+ if "data" not in json:
116
116
  raise ValueError("Unexpected API response to create request")
117
117
  return json["data"]
118
118
 
@@ -147,7 +147,7 @@ class ApiBackend(Backend):
147
147
  ]
148
148
 
149
149
  def _map_count_response(self, json):
150
- if not "total_matches" in json:
150
+ if "total_matches" not in json:
151
151
  raise ValueError("Unexpected API response when executing count request")
152
152
  return json["total_matches"]
153
153
 
@@ -168,7 +168,7 @@ class ApiBackend(Backend):
168
168
  return [url, self.records_method(configuration), self._as_post_data(configuration), {}]
169
169
 
170
170
  def _map_records_response(self, json):
171
- if not "data" in json:
171
+ if "data" not in json:
172
172
  raise ValueError("Unexpected response from records request")
173
173
  return json["data"]
174
174
 
@@ -186,7 +186,7 @@ class ApiBackend(Backend):
186
186
 
187
187
  if not response.ok:
188
188
  if self._auth and self._auth.has_dynamic_credentials and not is_retry:
189
- return self._execute_request(url, method, json=json, headers=headers, auth=self._auth, is_retry=True)
189
+ return self._execute_request(url, method, json=json, headers=headers, is_retry=True)
190
190
  if not response.ok:
191
191
  raise ValueError(f"Failed request. Status code: {response.status_code}, message: {response.content!r}")
192
192
 
@@ -198,7 +198,7 @@ class ApiBackend(Backend):
198
198
  raise KeyError(f"ApiBackend does not support config '{key}'. You may be using the wrong backend")
199
199
 
200
200
  for key in self._allowed_configs:
201
- if not key in configuration:
201
+ if key not in configuration:
202
202
  configuration[key] = [] if key[-1] == "s" else ""
203
203
  return configuration
204
204
 
@@ -41,6 +41,22 @@ def _sort(row_a, row_b, sorts):
41
41
  return reverse * (1 if value_a > value_b else -1)
42
42
  return 0
43
43
 
44
+ def like_check(column, values, null):
45
+ def matches(row):
46
+ value = row.get(column)
47
+ search = values[0].lower()
48
+ if not value or isinstance(value, Null):
49
+ return bool(search)
50
+
51
+ value = value.lower()
52
+ if search[0] == "%" and search[-1] == "%":
53
+ return search.strip('%') in value
54
+ if search[0] == "%":
55
+ return value[0:len(search)] == search.lstrip('%')
56
+ if search[-1] == "%":
57
+ return value[-1*len(search):] == search.rstrip('%')
58
+ return value == search
59
+ return matches
44
60
 
45
61
  class MemoryTable:
46
62
  _table_name = None
@@ -69,7 +85,7 @@ class MemoryTable:
69
85
  "is null": lambda column, values, null: lambda row: (column not in row or row[column] is None),
70
86
  "is not": lambda column, values, null: lambda row: row.get(column, null) != values[0],
71
87
  "is": lambda column, values, null: lambda row: row.get(column, null) == str(values[0]),
72
- "like": lambda column, values, null: lambda row: row.get(column, null) == str(values[0]),
88
+ "like": like_check,
73
89
  "in": lambda column, values, null: lambda row: row.get(column, null) in values,
74
90
  }
75
91
 
@@ -72,7 +72,7 @@ class List(Base):
72
72
  [models, limit] = self.configure_models_from_request_data(
73
73
  models, request_data, query_parameters, pagination_data
74
74
  )
75
- if not models.query_sorts:
75
+ if not models.query_sorts and self.configuration("default_sort_column"):
76
76
  models = models.sort_by(
77
77
  self.configuration("default_sort_column"),
78
78
  self.configuration("default_sort_direction"),
@@ -232,8 +232,8 @@ class List(Base):
232
232
  if type(self) != List:
233
233
  self._check_columns_in_configuration(configuration, "searchable_columns")
234
234
 
235
- if "default_sort_column" not in configuration:
236
- raise ValueError(f"{error_prefix} missing required configuration 'default_sort_column'")
235
+ # if "default_sort_column" not in configuration:
236
+ # raise ValueError(f"{error_prefix} missing required configuration 'default_sort_column'")
237
237
 
238
238
  # sortable_columns, wheres, and joins should all be iterables
239
239
  for config_name, contents in {