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

Files changed (149) hide show
  1. {clear_skies-2.0.6.dist-info → clear_skies-2.0.8.dist-info}/METADATA +1 -1
  2. clear_skies-2.0.8.dist-info/RECORD +252 -0
  3. clearskies/__init__.py +2 -2
  4. clearskies/authentication/authentication.py +1 -3
  5. clearskies/authentication/authorization.py +12 -5
  6. clearskies/authentication/authorization_pass_through.py +5 -3
  7. clearskies/authentication/jwks.py +25 -23
  8. clearskies/authentication/secret_bearer.py +15 -17
  9. clearskies/autodoc/schema/schema.py +1 -1
  10. clearskies/backends/api_backend.py +50 -56
  11. clearskies/backends/backend.py +14 -14
  12. clearskies/backends/cursor_backend.py +17 -23
  13. clearskies/backends/memory_backend.py +27 -30
  14. clearskies/backends/secrets_backend.py +13 -18
  15. clearskies/column.py +44 -56
  16. clearskies/columns/audit.py +14 -13
  17. clearskies/columns/belongs_to_id.py +10 -15
  18. clearskies/columns/belongs_to_model.py +6 -9
  19. clearskies/columns/belongs_to_self.py +13 -9
  20. clearskies/columns/boolean.py +13 -16
  21. clearskies/columns/category_tree.py +9 -11
  22. clearskies/columns/category_tree_children.py +2 -3
  23. clearskies/columns/category_tree_descendants.py +1 -1
  24. clearskies/columns/created.py +8 -11
  25. clearskies/columns/created_by_authorization_data.py +7 -9
  26. clearskies/columns/created_by_header.py +12 -8
  27. clearskies/columns/created_by_ip.py +6 -8
  28. clearskies/columns/created_by_routing_data.py +12 -7
  29. clearskies/columns/created_by_user_agent.py +6 -9
  30. clearskies/columns/date.py +12 -14
  31. clearskies/columns/datetime.py +19 -17
  32. clearskies/columns/email.py +3 -1
  33. clearskies/columns/float.py +10 -14
  34. clearskies/columns/has_many.py +8 -10
  35. clearskies/columns/has_many_self.py +13 -7
  36. clearskies/columns/has_one.py +2 -0
  37. clearskies/columns/integer.py +9 -11
  38. clearskies/columns/json.py +10 -12
  39. clearskies/columns/many_to_many_ids.py +14 -16
  40. clearskies/columns/many_to_many_ids_with_data.py +16 -16
  41. clearskies/columns/many_to_many_models.py +5 -7
  42. clearskies/columns/many_to_many_pivots.py +3 -5
  43. clearskies/columns/phone.py +12 -9
  44. clearskies/columns/select.py +12 -9
  45. clearskies/columns/string.py +1 -1
  46. clearskies/columns/timestamp.py +15 -15
  47. clearskies/columns/updated.py +8 -10
  48. clearskies/columns/uuid.py +7 -10
  49. clearskies/configs/any.py +2 -0
  50. clearskies/configs/any_dict.py +2 -0
  51. clearskies/configs/any_dict_or_callable.py +2 -0
  52. clearskies/configs/boolean.py +2 -0
  53. clearskies/configs/boolean_or_callable.py +2 -0
  54. clearskies/configs/callable_config.py +2 -0
  55. clearskies/configs/config.py +2 -0
  56. clearskies/configs/datetime.py +2 -0
  57. clearskies/configs/datetime_or_callable.py +2 -0
  58. clearskies/configs/float.py +2 -0
  59. clearskies/configs/float_or_callable.py +2 -0
  60. clearskies/configs/integer.py +2 -0
  61. clearskies/configs/integer_or_callable.py +2 -0
  62. clearskies/configs/list_any_dict.py +2 -0
  63. clearskies/configs/list_any_dict_or_callable.py +2 -0
  64. clearskies/configs/model_column.py +2 -0
  65. clearskies/configs/model_columns.py +2 -0
  66. clearskies/configs/model_destination_name.py +2 -1
  67. clearskies/configs/model_to_id_column.py +2 -0
  68. clearskies/configs/readable_model_column.py +2 -0
  69. clearskies/configs/readable_model_columns.py +2 -0
  70. clearskies/configs/searchable_model_columns.py +2 -0
  71. clearskies/configs/select.py +2 -0
  72. clearskies/configs/select_list.py +2 -0
  73. clearskies/configs/string.py +2 -0
  74. clearskies/configs/string_dict.py +2 -0
  75. clearskies/configs/string_list.py +2 -0
  76. clearskies/configs/string_list_or_callable.py +2 -0
  77. clearskies/configs/timedelta.py +2 -0
  78. clearskies/configs/timezone.py +2 -0
  79. clearskies/configs/url.py +2 -0
  80. clearskies/configs/writeable_model_column.py +2 -0
  81. clearskies/configs/writeable_model_columns.py +2 -0
  82. clearskies/configurable.py +2 -0
  83. clearskies/contexts/cli.py +9 -1
  84. clearskies/contexts/context.py +13 -14
  85. clearskies/contexts/wsgi.py +12 -10
  86. clearskies/contexts/wsgi_ref.py +12 -6
  87. clearskies/decorators.py +1 -1
  88. clearskies/decorators.pyi +10 -0
  89. clearskies/di/__init__.py +2 -1
  90. clearskies/di/di.py +7 -6
  91. clearskies/di/inject/by_class.py +2 -0
  92. clearskies/di/inject/by_name.py +2 -0
  93. clearskies/di/inject/di.py +2 -0
  94. clearskies/di/inject/environment.py +1 -1
  95. clearskies/di/inject/now.py +2 -0
  96. clearskies/di/inject/requests.py +2 -0
  97. clearskies/di/inject/secrets.py +2 -2
  98. clearskies/di/inject/utcnow.py +2 -0
  99. clearskies/di/inject/uuid.py +2 -2
  100. clearskies/end.py +45 -7
  101. clearskies/endpoint.py +43 -59
  102. clearskies/endpoint_group.py +15 -18
  103. clearskies/endpoints/advanced_search.py +19 -26
  104. clearskies/endpoints/callable.py +10 -16
  105. clearskies/endpoints/create.py +6 -10
  106. clearskies/endpoints/delete.py +5 -11
  107. clearskies/endpoints/get.py +11 -15
  108. clearskies/endpoints/health_check.py +9 -11
  109. clearskies/endpoints/list.py +29 -36
  110. clearskies/endpoints/restful_api.py +43 -53
  111. clearskies/endpoints/schema.py +14 -18
  112. clearskies/endpoints/simple_search.py +5 -12
  113. clearskies/endpoints/update.py +6 -11
  114. clearskies/environment.py +2 -0
  115. clearskies/input_outputs/cli.py +2 -0
  116. clearskies/input_outputs/headers.py +2 -0
  117. clearskies/input_outputs/input_output.py +15 -15
  118. clearskies/input_outputs/programmatic.py +2 -2
  119. clearskies/input_outputs/wsgi.py +2 -2
  120. clearskies/model.py +120 -25
  121. clearskies/query/query.py +1 -4
  122. clearskies/secrets/__init__.py +2 -1
  123. clearskies/secrets/akeyless.py +12 -10
  124. clearskies/secrets/secrets.py +7 -2
  125. clearskies/security_header.py +4 -2
  126. clearskies/security_headers/cache_control.py +15 -14
  127. clearskies/security_headers/cors.py +10 -9
  128. clearskies/security_headers/csp.py +25 -24
  129. clearskies/security_headers/hsts.py +6 -5
  130. clearskies/typing.py +1 -1
  131. clearskies/validator.py +5 -6
  132. clearskies/validators/after_column.py +6 -7
  133. clearskies/validators/before_column.py +2 -0
  134. clearskies/validators/in_the_future.py +5 -8
  135. clearskies/validators/in_the_future_at_least.py +2 -0
  136. clearskies/validators/in_the_future_at_most.py +2 -0
  137. clearskies/validators/in_the_past.py +5 -8
  138. clearskies/validators/in_the_past_at_least.py +2 -0
  139. clearskies/validators/in_the_past_at_most.py +2 -0
  140. clearskies/validators/maximum_length.py +4 -5
  141. clearskies/validators/maximum_value.py +4 -4
  142. clearskies/validators/minimum_length.py +4 -4
  143. clearskies/validators/minimum_value.py +4 -4
  144. clearskies/validators/required.py +2 -4
  145. clearskies/validators/timedelta.py +8 -9
  146. clearskies/validators/unique.py +2 -3
  147. clear_skies-2.0.6.dist-info/RECORD +0 -251
  148. {clear_skies-2.0.6.dist-info → clear_skies-2.0.8.dist-info}/WHEEL +0 -0
  149. {clear_skies-2.0.6.dist-info → clear_skies-2.0.8.dist-info}/licenses/LICENSE +0 -0
clearskies/model.py CHANGED
@@ -4,7 +4,6 @@ import re
4
4
  from abc import abstractmethod
5
5
  from typing import TYPE_CHECKING, Any, Callable, Iterator, Self
6
6
 
7
- from clearskies.autodoc.schema import Schema as AutoDocSchema
8
7
  from clearskies.di import InjectableProperties, inject
9
8
  from clearskies.functional import string
10
9
  from clearskies.query import Condition, Join, Query, Sort
@@ -12,6 +11,7 @@ from clearskies.schema import Schema
12
11
 
13
12
  if TYPE_CHECKING:
14
13
  from clearskies import Column
14
+ from clearskies.autodoc.schema import Schema as AutoDocSchema
15
15
  from clearskies.backends import Backend
16
16
 
17
17
 
@@ -63,6 +63,7 @@ class Model(Schema, InjectableProperties):
63
63
  from typing import Self
64
64
  import clearskies
65
65
 
66
+
66
67
  class Fish(clearskies.Model):
67
68
  @classmethod
68
69
  def destination_name(cls: type[Self]) -> str:
@@ -86,6 +87,7 @@ class Model(Schema, InjectableProperties):
86
87
  ```
87
88
  import clearskies
88
89
 
90
+
89
91
  class User(clearskies.Model):
90
92
  id_column_name = "id"
91
93
  backend = clearskies.backends.MemoryBackend()
@@ -93,11 +95,15 @@ class Model(Schema, InjectableProperties):
93
95
  id = clearskies.columns.Uuid()
94
96
  name = clearskies.columns.String()
95
97
 
98
+
96
99
  def my_application(user, users, by_type_hint: User):
97
100
  return {
98
- "all_are_user_models": isinstance(user, User) and isinstance(users, User) and isinstance(by_type_hint, User)
101
+ "all_are_user_models": isinstance(user, User)
102
+ and isinstance(users, User)
103
+ and isinstance(by_type_hint, User)
99
104
  }
100
105
 
106
+
101
107
  cli = clearskies.contexts.Cli(my_application, classes=[User])
102
108
  cli()
103
109
  ```
@@ -149,11 +155,13 @@ class Model(Schema, InjectableProperties):
149
155
  import datetime
150
156
  import clearskies
151
157
 
158
+
152
159
  class SomeClass:
153
160
  # Since this will be built by the DI system directly, we can declare dependencies in the __init__
154
161
  def __init__(self, some_date):
155
162
  self.some_date = some_date
156
163
 
164
+
157
165
  class User(clearskies.Model):
158
166
  id_column_name = "id"
159
167
  backend = clearskies.backends.MemoryBackend()
@@ -167,15 +175,17 @@ class Model(Schema, InjectableProperties):
167
175
  def some_date_in_the_past(self):
168
176
  return self.some_class.some_date < self.utcnow
169
177
 
178
+
170
179
  def my_application(user):
171
180
  return user.some_date_in_the_past()
172
181
 
182
+
173
183
  cli = clearskies.contexts.Cli(
174
184
  my_application,
175
185
  classes=[User],
176
186
  bindings={
177
187
  "some_date": datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=1),
178
- }
188
+ },
179
189
  )
180
190
  cli()
181
191
  ```
@@ -321,6 +331,7 @@ class Model(Schema, InjectableProperties):
321
331
  ```python
322
332
  import clearskies
323
333
 
334
+
324
335
  class User(clearskies.Model):
325
336
  id_column_name = "id"
326
337
  backend = clearskies.backends.MemoryBackend()
@@ -328,12 +339,16 @@ class Model(Schema, InjectableProperties):
328
339
  id = clearskies.columns.Uuid()
329
340
  name = clearskies.columns.String()
330
341
 
342
+
331
343
  def my_application(user):
332
- user.save({
333
- "name": "Awesome Person",
334
- })
344
+ user.save(
345
+ {
346
+ "name": "Awesome Person",
347
+ }
348
+ )
335
349
  return {"id": user.id, "name": user.name}
336
350
 
351
+
337
352
  cli = clearskies.contexts.Cli(
338
353
  my_application,
339
354
  classes=[User],
@@ -346,6 +361,7 @@ class Model(Schema, InjectableProperties):
346
361
  ```python
347
362
  import clearskies
348
363
 
364
+
349
365
  class User(clearskies.Model):
350
366
  id_column_name = "id"
351
367
  backend = clearskies.backends.MemoryBackend()
@@ -353,11 +369,13 @@ class Model(Schema, InjectableProperties):
353
369
  id = clearskies.columns.Uuid()
354
370
  name = clearskies.columns.String()
355
371
 
372
+
356
373
  def my_application(user):
357
374
  user.name = "Awesome Person"
358
375
  user.save()
359
376
  return {"id": user.id, "name": user.name}
360
377
 
378
+
361
379
  cli = clearskies.contexts.Cli(
362
380
  my_application,
363
381
  classes=[User],
@@ -379,6 +397,7 @@ class Model(Schema, InjectableProperties):
379
397
  ```
380
398
  import clearskies
381
399
 
400
+
382
401
  class User(clearskies.Model):
383
402
  id_column_name = "id"
384
403
  backend = clearskies.backends.MemoryBackend()
@@ -386,8 +405,8 @@ class Model(Schema, InjectableProperties):
386
405
  id = clearskies.columns.Uuid()
387
406
  name = clearskies.columns.String()
388
407
 
389
- def my_application(user):
390
408
 
409
+ def my_application(user):
391
410
  if not user:
392
411
  print("We will execute a create operation")
393
412
 
@@ -406,6 +425,7 @@ class Model(Schema, InjectableProperties):
406
425
 
407
426
  return {"id": user.id, "name": user.name}
408
427
 
428
+
409
429
  cli = clearskies.contexts.Cli(
410
430
  my_application,
411
431
  classes=[User],
@@ -422,6 +442,7 @@ class Model(Schema, InjectableProperties):
422
442
  ```
423
443
  import clearskies
424
444
 
445
+
425
446
  class User(clearskies.Model):
426
447
  id_column_name = "id"
427
448
  backend = clearskies.backends.MemoryBackend()
@@ -429,6 +450,7 @@ class Model(Schema, InjectableProperties):
429
450
  id = clearskies.columns.Uuid()
430
451
  name = clearskies.columns.String()
431
452
 
453
+
432
454
  def my_application(user):
433
455
  # create a record with just an id
434
456
  user.save(no_data=True)
@@ -438,6 +460,7 @@ class Model(Schema, InjectableProperties):
438
460
 
439
461
  return {"id": user.id, "name": user.name}
440
462
 
463
+
441
464
  cli = clearskies.contexts.Cli(
442
465
  my_application,
443
466
  classes=[User],
@@ -517,6 +540,7 @@ class Model(Schema, InjectableProperties):
517
540
  from typing import Any, Self
518
541
  import clearskies
519
542
 
543
+
520
544
  class User(clearskies.Model):
521
545
  id_column_name = "id"
522
546
  backend = clearskies.backends.MemoryBackend()
@@ -536,6 +560,7 @@ class Model(Schema, InjectableProperties):
536
560
  print("Nothing changed")
537
561
  return data
538
562
 
563
+
539
564
  def my_application(users):
540
565
  jane = users.create({"name": "Jane"})
541
566
  jane.save({"age": 22})
@@ -544,6 +569,7 @@ class Model(Schema, InjectableProperties):
544
569
 
545
570
  return {"id": jane.id, "name": jane.name}
546
571
 
572
+
547
573
  cli = clearskies.contexts.Cli(
548
574
  my_application,
549
575
  classes=[User],
@@ -600,6 +626,7 @@ class Model(Schema, InjectableProperties):
600
626
  from typing import Any, Self
601
627
  import clearskies
602
628
 
629
+
603
630
  class User(clearskies.Model):
604
631
  id_column_name = "id"
605
632
  backend = clearskies.backends.MemoryBackend()
@@ -618,11 +645,13 @@ class Model(Schema, InjectableProperties):
618
645
  print("Latest age: " + str(self.latest("age", data)))
619
646
  return data
620
647
 
648
+
621
649
  def my_application(users):
622
650
  jane = users.create({"name": "Jane"})
623
651
  jane.save({"age": 25})
624
652
  return {"id": jane.id, "name": jane.name}
625
653
 
654
+
626
655
  cli = clearskies.contexts.Cli(
627
656
  my_application,
628
657
  classes=[User],
@@ -659,6 +688,7 @@ class Model(Schema, InjectableProperties):
659
688
  ```
660
689
  import clearskies
661
690
 
691
+
662
692
  class User(clearskies.Model):
663
693
  id_column_name = "id"
664
694
  backend = clearskies.backends.MemoryBackend()
@@ -667,6 +697,7 @@ class Model(Schema, InjectableProperties):
667
697
  name = clearskies.columns.String()
668
698
  age = clearskies.columns.Integer()
669
699
 
700
+
670
701
  def my_application(users):
671
702
  jane = users.create({"name": "Jane"})
672
703
  return {
@@ -674,6 +705,7 @@ class Model(Schema, InjectableProperties):
674
705
  "age_changed": jane.was_changed("age"),
675
706
  }
676
707
 
708
+
677
709
  cli = clearskies.contexts.Cli(
678
710
  my_application,
679
711
  classes=[User],
@@ -713,6 +745,7 @@ class Model(Schema, InjectableProperties):
713
745
  ```
714
746
  import clearskies
715
747
 
748
+
716
749
  class User(clearskies.Model):
717
750
  id_column_name = "id"
718
751
  backend = clearskies.backends.MemoryBackend()
@@ -720,11 +753,13 @@ class Model(Schema, InjectableProperties):
720
753
  id = clearskies.columns.Uuid()
721
754
  name = clearskies.columns.String()
722
755
 
756
+
723
757
  def my_application(users):
724
758
  jane = users.create({"name": "Jane"})
725
759
  jane.save({"name": "Jane Doe"})
726
760
  return {"name": jane.name, "previous_name": jane.previous_value("name")}
727
761
 
762
+
728
763
  cli = clearskies.contexts.Cli(
729
764
  my_application,
730
765
  classes=[User],
@@ -758,6 +793,7 @@ class Model(Schema, InjectableProperties):
758
793
  ```
759
794
  import clearskies
760
795
 
796
+
761
797
  class User(clearskies.Model):
762
798
  id_column_name = "id"
763
799
  backend = clearskies.backends.MemoryBackend()
@@ -765,6 +801,7 @@ class Model(Schema, InjectableProperties):
765
801
  id = clearskies.columns.Uuid()
766
802
  name = clearskies.columns.String()
767
803
 
804
+
768
805
  def my_application(users):
769
806
  alice = users.create({"name": "Alice"})
770
807
 
@@ -778,12 +815,12 @@ class Model(Schema, InjectableProperties):
778
815
 
779
816
  return {"id": alice.id, "name": alice.name}
780
817
 
818
+
781
819
  cli = clearskies.contexts.Cli(
782
820
  my_application,
783
821
  classes=[User],
784
822
  )
785
823
  cli()
786
-
787
824
  ```
788
825
  """
789
826
  self.no_queries()
@@ -855,7 +892,7 @@ class Model(Schema, InjectableProperties):
855
892
 
856
893
  def pre_save(self: Self, data: dict[str, Any]) -> dict[str, Any]:
857
894
  """
858
- A hook to add additional logic in the pre-save step of the save process.
895
+ Add a hook to add additional logic in the pre-save step of the save process.
859
896
 
860
897
  The pre/post/finished steps of the model are directly analogous to the pre/post/finished steps for the columns.
861
898
 
@@ -873,6 +910,7 @@ class Model(Schema, InjectableProperties):
873
910
  from typing import Any, Self
874
911
  import clearskies
875
912
 
913
+
876
914
  class User(clearskies.Model):
877
915
  id_column_name = "id"
878
916
  backend = clearskies.backends.MemoryBackend()
@@ -889,11 +927,12 @@ class Model(Schema, InjectableProperties):
889
927
 
890
928
  return additional_data
891
929
 
930
+
892
931
  def my_application(users):
893
932
  jane = users.create({"name": "Jane"})
894
933
  is_anonymous_after_create = jane.is_anonymous
895
934
 
896
- jane.save({"name":""})
935
+ jane.save({"name": ""})
897
936
  is_anonymous_after_first_update = jane.is_anonymous
898
937
 
899
938
  jane.save({"name": "Jane Doe"})
@@ -905,6 +944,7 @@ class Model(Schema, InjectableProperties):
905
944
  "is_anonymous_after_last_update": is_anonymous_after_last_update,
906
945
  }
907
946
 
947
+
908
948
  cli = clearskies.contexts.Cli(
909
949
  my_application,
910
950
  classes=[User],
@@ -923,7 +963,7 @@ class Model(Schema, InjectableProperties):
923
963
 
924
964
  def post_save(self: Self, data: dict[str, Any], id: str | int) -> None:
925
965
  """
926
- A hook to add additional logic in the post-save step of the save process.
966
+ Add hook to add additional logic in the post-save step of the save process.
927
967
 
928
968
  It is passed in the data being saved as well as the id of the record. Keep in mind that the post save
929
969
  hook happens after the backend has been updated (but before the model is updated) so if you need to make
@@ -934,6 +974,7 @@ class Model(Schema, InjectableProperties):
934
974
  from typing import Any, Self
935
975
  import clearskies
936
976
 
977
+
937
978
  class History(clearskies.Model):
938
979
  id_column_name = "id"
939
980
  backend = clearskies.backends.MemoryBackend()
@@ -942,6 +983,7 @@ class Model(Schema, InjectableProperties):
942
983
  message = clearskies.columns.String()
943
984
  created_at = clearskies.columns.Created(date_format="%Y-%m-%d %H:%M:%S.%f")
944
985
 
986
+
945
987
  class User(clearskies.Model):
946
988
  id_column_name = "id"
947
989
  backend = clearskies.backends.MemoryBackend()
@@ -959,6 +1001,7 @@ class Model(Schema, InjectableProperties):
959
1001
  age = self.latest("age", data)
960
1002
  self.histories.create({"message": f"My name is {name} and I am {age} years old"})
961
1003
 
1004
+
962
1005
  def my_application(users, histories):
963
1006
  jane = users.create({"name": "Jane"})
964
1007
  jane.save({"age": 25})
@@ -967,6 +1010,7 @@ class Model(Schema, InjectableProperties):
967
1010
 
968
1011
  return [history.message for history in histories.sort_by("created_at", "ASC")]
969
1012
 
1013
+
970
1014
  cli = clearskies.contexts.Cli(
971
1015
  my_application,
972
1016
  classes=[User, History],
@@ -978,9 +1022,9 @@ class Model(Schema, InjectableProperties):
978
1022
 
979
1023
  def save_finished(self: Self) -> None:
980
1024
  """
981
- A hook to add additional logicin the save_finished step of the save process.
1025
+ Add a hook to add additional logic in the save_finished step of the save process.
982
1026
 
983
- It has no retrun value and is passed no data. By the time this fires the model has already been
1027
+ It has no return value and is passed no data. By the time this fires the model has already been
984
1028
  updated with the new data. You can decide on the necessary actions using the `was_changed` and
985
1029
  the `previous_value` functions.
986
1030
 
@@ -988,6 +1032,7 @@ class Model(Schema, InjectableProperties):
988
1032
  from typing import Any, Self
989
1033
  import clearskies
990
1034
 
1035
+
991
1036
  class History(clearskies.Model):
992
1037
  id_column_name = "id"
993
1038
  backend = clearskies.backends.MemoryBackend()
@@ -996,6 +1041,7 @@ class Model(Schema, InjectableProperties):
996
1041
  message = clearskies.columns.String()
997
1042
  created_at = clearskies.columns.Created(date_format="%Y-%m-%d %H:%M:%S.%f")
998
1043
 
1044
+
999
1045
  class User(clearskies.Model):
1000
1046
  id_column_name = "id"
1001
1047
  backend = clearskies.backends.MemoryBackend()
@@ -1011,6 +1057,7 @@ class Model(Schema, InjectableProperties):
1011
1057
 
1012
1058
  self.histories.create({"message": f"My name is {self.name} and I am {self.age} years old"})
1013
1059
 
1060
+
1014
1061
  def my_application(users, histories):
1015
1062
  jane = users.create({"name": "Jane"})
1016
1063
  jane.save({"age": 25})
@@ -1019,6 +1066,7 @@ class Model(Schema, InjectableProperties):
1019
1066
 
1020
1067
  return [history.message for history in histories.sort_by("created_at", "ASC")]
1021
1068
 
1069
+
1022
1070
  cli = clearskies.contexts.Cli(
1023
1071
  my_application,
1024
1072
  classes=[User, History],
@@ -1054,9 +1102,7 @@ class Model(Schema, InjectableProperties):
1054
1102
  authorization_data: dict[str, Any],
1055
1103
  overrides: dict[str, Column] = {},
1056
1104
  ) -> Self:
1057
- """
1058
- A hook to automatically apply filtering whenever the model makes an appearance in a get/update/list/search handler.
1059
- """
1105
+ """Add a hook to automatically apply filtering whenever the model makes an appearance in a get/update/list/search handler."""
1060
1106
  for column in self.get_columns(overrides=overrides).values():
1061
1107
  models = column.where_for_request(model, input_output, routing_data, authorization_data) # type: ignore
1062
1108
  return self.where_for_request(
@@ -1072,7 +1118,7 @@ class Model(Schema, InjectableProperties):
1072
1118
  overrides: dict[str, Column] = {},
1073
1119
  ) -> Self:
1074
1120
  """
1075
- A hook to automatically apply filtering whenever the model makes an appearance in a get/update/list/search handler.
1121
+ Add a hook to automatically apply filtering whenever the model makes an appearance in a get/update/list/search handler.
1076
1122
 
1077
1123
  Note that this automatically affects the behavior of the various list endpoints, but won't be called when you create your
1078
1124
  own queries directly. Here's an example where the model restricts the list endpoint so that it only returns users with
@@ -1082,6 +1128,7 @@ class Model(Schema, InjectableProperties):
1082
1128
  from typing import Any, Self
1083
1129
  import clearskies
1084
1130
 
1131
+
1085
1132
  class User(clearskies.Model):
1086
1133
  id_column_name = "id"
1087
1134
  backend = clearskies.backends.MemoryBackend()
@@ -1099,6 +1146,7 @@ class Model(Schema, InjectableProperties):
1099
1146
  ) -> Self:
1100
1147
  return model.where("age>=18")
1101
1148
 
1149
+
1102
1150
  list_users = clearskies.endpoints.List(
1103
1151
  model_class=User,
1104
1152
  readable_column_names=["id", "name", "age"],
@@ -1144,6 +1192,7 @@ class Model(Schema, InjectableProperties):
1144
1192
  ```
1145
1193
  import clearskies
1146
1194
 
1195
+
1147
1196
  class User(clearskies.Model):
1148
1197
  id_column_name = "id"
1149
1198
  backend = clearskies.backends.MemoryBackend()
@@ -1151,6 +1200,7 @@ class Model(Schema, InjectableProperties):
1151
1200
  id = clearskies.columns.Uuid()
1152
1201
  name = clearskies.columns.String()
1153
1202
 
1203
+
1154
1204
  def my_application(users):
1155
1205
  jane = users.create({"name": "Jane"})
1156
1206
  jane_instance_has_query = jane.has_query()
@@ -1170,6 +1220,7 @@ class Model(Schema, InjectableProperties):
1170
1220
  "invalid_request_error": invalid_request_error,
1171
1221
  }
1172
1222
 
1223
+
1173
1224
  cli = clearskies.contexts.Cli(
1174
1225
  my_application,
1175
1226
  classes=[User],
@@ -1183,7 +1234,7 @@ class Model(Schema, InjectableProperties):
1183
1234
  {
1184
1235
  "jane_instance_has_query": false,
1185
1236
  "some_search_has_query": true,
1186
- "invalid_request_error": "You attempted to save/read record data for a model being used to make a query. This is not allowed, as it is typically a sign of a bug in your application code."
1237
+ "invalid_request_error": "You attempted to save/read record data for a model being used to make a query. This is not allowed, as it is typically a sign of a bug in your application code.",
1187
1238
  }
1188
1239
  ```
1189
1240
 
@@ -1267,7 +1318,7 @@ class Model(Schema, InjectableProperties):
1267
1318
  return self.with_query(self.get_query().set_select_all(select_all))
1268
1319
 
1269
1320
  def where(self: Self, where: str | Condition) -> Self:
1270
- """
1321
+ r"""
1271
1322
  Add a condition to a query.
1272
1323
 
1273
1324
  The `where` method (in combination with the `find` method) is typically the starting point for query records in
@@ -1314,6 +1365,7 @@ class Model(Schema, InjectableProperties):
1314
1365
  ```python
1315
1366
  import clearskies
1316
1367
 
1368
+
1317
1369
  class Order(clearskies.Model):
1318
1370
  id_column_name = "id"
1319
1371
  backend = clearskies.backends.MemoryBackend()
@@ -1323,12 +1375,17 @@ class Model(Schema, InjectableProperties):
1323
1375
  status = clearskies.columns.Select(["Pending", "In Progress"])
1324
1376
  total = clearskies.columns.Float()
1325
1377
 
1378
+
1326
1379
  def my_application(orders):
1327
1380
  orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
1328
1381
  orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
1329
1382
  orders.create({"user_id": "Jane", "status": "Pending", "total": 30})
1330
1383
 
1331
- return [order.user_id for order in orders.where("status=Pending").where(Order.total.greater_than(25))]
1384
+ return [
1385
+ order.user_id
1386
+ for order in orders.where("status=Pending").where(Order.total.greater_than(25))
1387
+ ]
1388
+
1332
1389
 
1333
1390
  cli = clearskies.contexts.Cli(
1334
1391
  my_application,
@@ -1367,6 +1424,7 @@ class Model(Schema, InjectableProperties):
1367
1424
  ```
1368
1425
  import clearskies
1369
1426
 
1427
+
1370
1428
  class User(clearskies.Model):
1371
1429
  id_column_name = "id"
1372
1430
  backend = clearskies.backends.MemoryBackend()
@@ -1374,6 +1432,7 @@ class Model(Schema, InjectableProperties):
1374
1432
  id = clearskies.columns.Uuid()
1375
1433
  name = clearskies.columns.String()
1376
1434
 
1435
+
1377
1436
  class Order(clearskies.Model):
1378
1437
  id_column_name = "id"
1379
1438
  backend = clearskies.backends.MemoryBackend()
@@ -1384,6 +1443,7 @@ class Model(Schema, InjectableProperties):
1384
1443
  status = clearskies.columns.Select(["Pending", "In Progress"])
1385
1444
  total = clearskies.columns.Float()
1386
1445
 
1446
+
1387
1447
  def my_application(users, orders):
1388
1448
  jane = users.create({"name": "Jane"})
1389
1449
  another_jane = users.create({"name": "Jane"})
@@ -1402,7 +1462,13 @@ class Model(Schema, InjectableProperties):
1402
1462
  orders.create({"user_id": bob.id, "status": "In Progress", "total": 35})
1403
1463
 
1404
1464
  # return all orders for anyone named Jane that have a status of Pending
1405
- return orders.join("join users on users.id=orders.user_id").where("users.name=Jane").sort_by("total", "asc").where("status=Pending")
1465
+ return (
1466
+ orders.join("join users on users.id=orders.user_id")
1467
+ .where("users.name=Jane")
1468
+ .sort_by("total", "asc")
1469
+ .where("status=Pending")
1470
+ )
1471
+
1406
1472
 
1407
1473
  cli = clearskies.contexts.Cli(
1408
1474
  clearskies.endpoints.Callable(
@@ -1413,7 +1479,6 @@ class Model(Schema, InjectableProperties):
1413
1479
  classes=[Order, User],
1414
1480
  )
1415
1481
  cli()
1416
-
1417
1482
  ```
1418
1483
  """
1419
1484
  self.no_single_model()
@@ -1460,6 +1525,7 @@ class Model(Schema, InjectableProperties):
1460
1525
  ```
1461
1526
  import clearskies
1462
1527
 
1528
+
1463
1529
  class Order(clearskies.Model):
1464
1530
  id_column_name = "id"
1465
1531
  backend = clearskies.backends.MemoryBackend()
@@ -1469,13 +1535,17 @@ class Model(Schema, InjectableProperties):
1469
1535
  status = clearskies.columns.Select(["Pending", "In Progress"])
1470
1536
  total = clearskies.columns.Float()
1471
1537
 
1538
+
1472
1539
  def my_application(orders):
1473
1540
  orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
1474
1541
  orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
1475
1542
  orders.create({"user_id": "Alice", "status": "Pending", "total": 30})
1476
1543
  orders.create({"user_id": "Bob", "status": "Pending", "total": 26})
1477
1544
 
1478
- return orders.sort_by("user_id", "asc", secondary_column_name="total", secondary_direction="desc")
1545
+ return orders.sort_by(
1546
+ "user_id", "asc", secondary_column_name="total", secondary_direction="desc"
1547
+ )
1548
+
1479
1549
 
1480
1550
  cli = clearskies.contexts.Cli(
1481
1551
  clearskies.endpoints.Callable(
@@ -1502,6 +1572,7 @@ class Model(Schema, InjectableProperties):
1502
1572
  ```
1503
1573
  import clearskies
1504
1574
 
1575
+
1505
1576
  class Order(clearskies.Model):
1506
1577
  id_column_name = "id"
1507
1578
  backend = clearskies.backends.MemoryBackend()
@@ -1511,6 +1582,7 @@ class Model(Schema, InjectableProperties):
1511
1582
  status = clearskies.columns.Select(["Pending", "In Progress"])
1512
1583
  total = clearskies.columns.Float()
1513
1584
 
1585
+
1514
1586
  def my_application(orders):
1515
1587
  orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
1516
1588
  orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
@@ -1519,6 +1591,7 @@ class Model(Schema, InjectableProperties):
1519
1591
 
1520
1592
  return orders.limit(2)
1521
1593
 
1594
+
1522
1595
  cli = clearskies.contexts.Cli(
1523
1596
  clearskies.endpoints.Callable(
1524
1597
  my_application,
@@ -1548,6 +1621,7 @@ class Model(Schema, InjectableProperties):
1548
1621
  ```
1549
1622
  import clearskies
1550
1623
 
1624
+
1551
1625
  class Order(clearskies.Model):
1552
1626
  id_column_name = "id"
1553
1627
  backend = clearskies.backends.MemoryBackend()
@@ -1557,6 +1631,7 @@ class Model(Schema, InjectableProperties):
1557
1631
  status = clearskies.columns.Select(["Pending", "In Progress"])
1558
1632
  total = clearskies.columns.Float()
1559
1633
 
1634
+
1560
1635
  def my_application(orders):
1561
1636
  orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
1562
1637
  orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
@@ -1565,6 +1640,7 @@ class Model(Schema, InjectableProperties):
1565
1640
 
1566
1641
  return orders.sort_by("total", "asc").pagination(start=2)
1567
1642
 
1643
+
1568
1644
  cli = clearskies.contexts.Cli(
1569
1645
  clearskies.endpoints.Callable(
1570
1646
  my_application,
@@ -1604,6 +1680,7 @@ class Model(Schema, InjectableProperties):
1604
1680
  ```python
1605
1681
  import clearskies
1606
1682
 
1683
+
1607
1684
  class Order(clearskies.Model):
1608
1685
  id_column_name = "id"
1609
1686
  backend = clearskies.backends.MemoryBackend()
@@ -1613,6 +1690,7 @@ class Model(Schema, InjectableProperties):
1613
1690
  status = clearskies.columns.Select(["Pending", "In Progress"])
1614
1691
  total = clearskies.columns.Float()
1615
1692
 
1693
+
1616
1694
  def my_application(orders):
1617
1695
  orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
1618
1696
  orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
@@ -1627,6 +1705,7 @@ class Model(Schema, InjectableProperties):
1627
1705
  "total": jane.total,
1628
1706
  }
1629
1707
 
1708
+
1630
1709
  cli = clearskies.contexts.Cli(
1631
1710
  my_application,
1632
1711
  classes=[Order],
@@ -1668,6 +1747,7 @@ class Model(Schema, InjectableProperties):
1668
1747
  ```
1669
1748
  import clearskies
1670
1749
 
1750
+
1671
1751
  class Order(clearskies.Model):
1672
1752
  id_column_name = "id"
1673
1753
  backend = clearskies.backends.MemoryBackend()
@@ -1677,6 +1757,7 @@ class Model(Schema, InjectableProperties):
1677
1757
  status = clearskies.columns.Select(["Pending", "In Progress"])
1678
1758
  total = clearskies.columns.Float()
1679
1759
 
1760
+
1680
1761
  def my_application(orders):
1681
1762
  orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
1682
1763
  orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
@@ -1685,6 +1766,7 @@ class Model(Schema, InjectableProperties):
1685
1766
 
1686
1767
  return orders.limit(1).paginate_all()
1687
1768
 
1769
+
1688
1770
  cli = clearskies.contexts.Cli(
1689
1771
  clearskies.endpoints.Callable(
1690
1772
  my_application,
@@ -1724,6 +1806,7 @@ class Model(Schema, InjectableProperties):
1724
1806
  ```
1725
1807
  import clearskies
1726
1808
 
1809
+
1727
1810
  class User(clearskies.Model):
1728
1811
  id_column_name = "id"
1729
1812
  backend = clearskies.backends.MemoryBackend()
@@ -1731,6 +1814,7 @@ class Model(Schema, InjectableProperties):
1731
1814
  id = clearskies.columns.Uuid()
1732
1815
  name = clearskies.columns.String()
1733
1816
 
1817
+
1734
1818
  def my_application(users):
1735
1819
  jane = users.create({"name": "Jane"})
1736
1820
 
@@ -1741,6 +1825,7 @@ class Model(Schema, InjectableProperties):
1741
1825
 
1742
1826
  return {"id": another_jane_object.id, "name": another_jane_object.name}
1743
1827
 
1828
+
1744
1829
  cli = clearskies.contexts.Cli(
1745
1830
  my_application,
1746
1831
  classes=[User],
@@ -1754,7 +1839,9 @@ class Model(Schema, InjectableProperties):
1754
1839
 
1755
1840
  def empty(self: Self) -> Self:
1756
1841
  """
1757
- An alias for self.model({})
1842
+ Create a an empty model instance.
1843
+
1844
+ An alias for self.model({}).
1758
1845
 
1759
1846
  This just provides you a fresh, empty model instance that you can use for populating with data or creating
1760
1847
  a new record. Here's a simple exmaple. Both print statements will be printed and it will return the id
@@ -1763,6 +1850,7 @@ class Model(Schema, InjectableProperties):
1763
1850
  ```
1764
1851
  import clearskies
1765
1852
 
1853
+
1766
1854
  class User(clearskies.Model):
1767
1855
  id_column_name = "id"
1768
1856
  backend = clearskies.backends.MemoryBackend()
@@ -1770,6 +1858,7 @@ class Model(Schema, InjectableProperties):
1770
1858
  id = clearskies.columns.Uuid()
1771
1859
  name = clearskies.columns.String()
1772
1860
 
1861
+
1773
1862
  def my_application(users):
1774
1863
  alice = users.create({"name": "Alice"})
1775
1864
 
@@ -1783,6 +1872,7 @@ class Model(Schema, InjectableProperties):
1783
1872
 
1784
1873
  return {"alice_id": alice.id, "blank_id": blank.id}
1785
1874
 
1875
+
1786
1876
  cli = clearskies.contexts.Cli(
1787
1877
  my_application,
1788
1878
  classes=[User],
@@ -1805,6 +1895,7 @@ class Model(Schema, InjectableProperties):
1805
1895
  ```
1806
1896
  import clearskies
1807
1897
 
1898
+
1808
1899
  class User(clearskies.Model):
1809
1900
  id_column_name = "id"
1810
1901
  backend = clearskies.backends.MemoryBackend()
@@ -1812,6 +1903,7 @@ class Model(Schema, InjectableProperties):
1812
1903
  id = clearskies.columns.Uuid()
1813
1904
  name = clearskies.columns.String()
1814
1905
 
1906
+
1815
1907
  def my_application(user):
1816
1908
  # let's create a new record
1817
1909
  user.save({"name": "Alice"})
@@ -1824,6 +1916,7 @@ class Model(Schema, InjectableProperties):
1824
1916
  "Bob": bob.name,
1825
1917
  }
1826
1918
 
1919
+
1827
1920
  cli = clearskies.contexts.Cli(
1828
1921
  my_application,
1829
1922
  classes=[User],
@@ -1847,6 +1940,7 @@ class Model(Schema, InjectableProperties):
1847
1940
  ```
1848
1941
  import clearskies
1849
1942
 
1943
+
1850
1944
  class Order(clearskies.Model):
1851
1945
  id_column_name = "id"
1852
1946
  backend = clearskies.backends.MemoryBackend()
@@ -1856,6 +1950,7 @@ class Model(Schema, InjectableProperties):
1856
1950
  status = clearskies.columns.Select(["Pending", "In Progress"])
1857
1951
  total = clearskies.columns.Float()
1858
1952
 
1953
+
1859
1954
  def my_application(orders):
1860
1955
  orders.create({"user_id": "Bob", "status": "Pending", "total": 25})
1861
1956
  orders.create({"user_id": "Alice", "status": "In Progress", "total": 15})
@@ -1870,12 +1965,12 @@ class Model(Schema, InjectableProperties):
1870
1965
  "total": jane.total,
1871
1966
  }
1872
1967
 
1968
+
1873
1969
  cli = clearskies.contexts.Cli(
1874
1970
  my_application,
1875
1971
  classes=[Order],
1876
1972
  )
1877
1973
  cli()
1878
-
1879
1974
  ```
1880
1975
  """
1881
1976
  self.no_single_model()