piccolo 1.17.0__tar.gz → 1.18.0__tar.gz

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.
Files changed (385) hide show
  1. {piccolo-1.17.0 → piccolo-1.18.0}/PKG-INFO +1 -1
  2. piccolo-1.18.0/piccolo/__init__.py +1 -0
  3. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/new.py +1 -1
  4. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/auto/diffable_table.py +10 -3
  5. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/objects.py +56 -0
  6. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/raw.py +13 -0
  7. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/table.py +38 -1
  8. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo.egg-info/PKG-INFO +1 -1
  9. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo.egg-info/SOURCES.txt +1 -0
  10. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/auto/integration/test_migrations.py +19 -0
  11. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/auto/test_diffable_table.py +13 -0
  12. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_batch.py +41 -0
  13. piccolo-1.18.0/tests/table/test_update_self.py +27 -0
  14. piccolo-1.17.0/piccolo/__init__.py +0 -1
  15. {piccolo-1.17.0 → piccolo-1.18.0}/LICENSE +0 -0
  16. {piccolo-1.17.0 → piccolo-1.18.0}/README.md +0 -0
  17. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/__init__.py +0 -0
  18. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/app/__init__.py +0 -0
  19. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/app/commands/__init__.py +0 -0
  20. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/app/commands/new.py +0 -0
  21. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/app/commands/show_all.py +0 -0
  22. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/app/commands/templates/piccolo_app.py.jinja +0 -0
  23. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/app/commands/templates/tables.py.jinja +0 -0
  24. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/app/piccolo_app.py +0 -0
  25. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/__init__.py +0 -0
  26. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/__init__.py +0 -0
  27. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/README.md.jinja +0 -0
  28. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/_blacksheep_app.py.jinja +0 -0
  29. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/_esmerald_app.py.jinja +0 -0
  30. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/_fastapi_app.py.jinja +0 -0
  31. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/_lilya_app.py.jinja +0 -0
  32. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/_litestar_app.py.jinja +0 -0
  33. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/_starlette_app.py.jinja +0 -0
  34. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/app.py.jinja +0 -0
  35. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/conftest.py.jinja +0 -0
  36. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/__init__.py.jinja +0 -0
  37. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/_blacksheep_endpoints.py.jinja +0 -0
  38. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/_esmerald_endpoints.py.jinja +0 -0
  39. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/_lilya_endpoints.py.jinja +0 -0
  40. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/_litestar_endpoints.py.jinja +0 -0
  41. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/_starlette_endpoints.py.jinja +0 -0
  42. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/endpoints.py.jinja +0 -0
  43. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/piccolo_app.py.jinja +0 -0
  44. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/piccolo_migrations/README.md +0 -0
  45. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/tables.py.jinja +0 -0
  46. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/templates/base.html.jinja_raw +0 -0
  47. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/home/templates/home.html.jinja_raw +0 -0
  48. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/main.py.jinja +0 -0
  49. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/piccolo_conf.py.jinja +0 -0
  50. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/piccolo_conf_test.py.jinja +0 -0
  51. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/requirements.txt.jinja +0 -0
  52. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/static/favicon.ico +0 -0
  53. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/commands/templates/app/static/main.css +0 -0
  54. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/asgi/piccolo_app.py +0 -0
  55. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/fixtures/__init__.py +0 -0
  56. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/fixtures/commands/__init__.py +0 -0
  57. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/fixtures/commands/dump.py +0 -0
  58. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/fixtures/commands/load.py +0 -0
  59. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/fixtures/commands/shared.py +0 -0
  60. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/fixtures/piccolo_app.py +0 -0
  61. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/meta/__init__.py +0 -0
  62. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/meta/commands/__init__.py +0 -0
  63. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/meta/commands/version.py +0 -0
  64. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/meta/piccolo_app.py +0 -0
  65. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/__init__.py +0 -0
  66. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/auto/__init__.py +0 -0
  67. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/auto/migration_manager.py +0 -0
  68. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/auto/operations.py +0 -0
  69. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/auto/schema_differ.py +0 -0
  70. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/auto/schema_snapshot.py +0 -0
  71. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/auto/serialisation.py +0 -0
  72. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/auto/serialisation_legacy.py +0 -0
  73. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/commands/__init__.py +0 -0
  74. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/commands/backwards.py +0 -0
  75. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/commands/base.py +0 -0
  76. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/commands/check.py +0 -0
  77. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/commands/clean.py +0 -0
  78. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/commands/forwards.py +0 -0
  79. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/commands/new.py +0 -0
  80. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/commands/templates/migration.py.jinja +0 -0
  81. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/piccolo_app.py +0 -0
  82. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/migrations/tables.py +0 -0
  83. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/playground/__init__.py +0 -0
  84. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/playground/commands/__init__.py +0 -0
  85. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/playground/commands/run.py +0 -0
  86. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/playground/piccolo_app.py +0 -0
  87. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/project/__init__.py +0 -0
  88. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/project/commands/__init__.py +0 -0
  89. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/project/commands/new.py +0 -0
  90. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/project/commands/templates/piccolo_conf.py.jinja +0 -0
  91. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/project/piccolo_app.py +0 -0
  92. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/schema/__init__.py +0 -0
  93. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/schema/commands/__init__.py +0 -0
  94. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/schema/commands/exceptions.py +0 -0
  95. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/schema/commands/generate.py +0 -0
  96. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/schema/commands/graph.py +0 -0
  97. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/schema/commands/templates/graphviz.dot.jinja +0 -0
  98. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/schema/piccolo_app.py +0 -0
  99. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/shell/__init__.py +0 -0
  100. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/shell/commands/__init__.py +0 -0
  101. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/shell/commands/run.py +0 -0
  102. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/shell/piccolo_app.py +0 -0
  103. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/sql_shell/__init__.py +0 -0
  104. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/sql_shell/commands/__init__.py +0 -0
  105. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/sql_shell/commands/run.py +0 -0
  106. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/sql_shell/piccolo_app.py +0 -0
  107. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/tester/__init__.py +0 -0
  108. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/tester/commands/__init__.py +0 -0
  109. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/tester/commands/run.py +0 -0
  110. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/tester/piccolo_app.py +0 -0
  111. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/__init__.py +0 -0
  112. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/commands/__init__.py +0 -0
  113. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/commands/change_password.py +0 -0
  114. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/commands/change_permissions.py +0 -0
  115. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/commands/create.py +0 -0
  116. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/commands/list.py +0 -0
  117. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/piccolo_app.py +0 -0
  118. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/piccolo_migrations/2019-11-14T21-52-21.py +0 -0
  119. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/piccolo_migrations/2020-06-11T21-38-55.py +0 -0
  120. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/piccolo_migrations/2021-04-30T16-14-15.py +0 -0
  121. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/piccolo_migrations/__init__.py +0 -0
  122. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/apps/user/tables.py +0 -0
  123. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/__init__.py +0 -0
  124. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/base.py +0 -0
  125. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/choices.py +0 -0
  126. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/column_types.py +0 -0
  127. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/combination.py +0 -0
  128. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/defaults/__init__.py +0 -0
  129. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/defaults/base.py +0 -0
  130. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/defaults/date.py +0 -0
  131. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/defaults/interval.py +0 -0
  132. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/defaults/time.py +0 -0
  133. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/defaults/timestamp.py +0 -0
  134. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/defaults/timestamptz.py +0 -0
  135. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/defaults/uuid.py +0 -0
  136. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/indexes.py +0 -0
  137. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/m2m.py +0 -0
  138. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/operators/__init__.py +0 -0
  139. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/operators/base.py +0 -0
  140. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/operators/comparison.py +0 -0
  141. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/operators/math.py +0 -0
  142. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/operators/string.py +0 -0
  143. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/readable.py +0 -0
  144. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/columns/reference.py +0 -0
  145. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/conf/__init__.py +0 -0
  146. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/conf/apps.py +0 -0
  147. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/custom_types.py +0 -0
  148. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/engine/__init__.py +0 -0
  149. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/engine/base.py +0 -0
  150. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/engine/cockroach.py +0 -0
  151. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/engine/exceptions.py +0 -0
  152. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/engine/finder.py +0 -0
  153. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/engine/postgres.py +0 -0
  154. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/engine/sqlite.py +0 -0
  155. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/main.py +0 -0
  156. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/py.typed +0 -0
  157. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/__init__.py +0 -0
  158. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/base.py +0 -0
  159. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/functions/__init__.py +0 -0
  160. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/functions/aggregate.py +0 -0
  161. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/functions/base.py +0 -0
  162. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/functions/datetime.py +0 -0
  163. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/functions/math.py +0 -0
  164. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/functions/string.py +0 -0
  165. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/functions/type_conversion.py +0 -0
  166. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/__init__.py +0 -0
  167. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/alter.py +0 -0
  168. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/count.py +0 -0
  169. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/create.py +0 -0
  170. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/create_index.py +0 -0
  171. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/delete.py +0 -0
  172. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/drop_index.py +0 -0
  173. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/exists.py +0 -0
  174. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/indexes.py +0 -0
  175. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/insert.py +0 -0
  176. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/refresh.py +0 -0
  177. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/select.py +0 -0
  178. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/table_exists.py +0 -0
  179. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/methods/update.py +0 -0
  180. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/mixins.py +0 -0
  181. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/query/proxy.py +0 -0
  182. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/querystring.py +0 -0
  183. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/schema.py +0 -0
  184. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/table_reflection.py +0 -0
  185. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/testing/__init__.py +0 -0
  186. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/testing/model_builder.py +0 -0
  187. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/testing/random_builder.py +0 -0
  188. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/testing/test_case.py +0 -0
  189. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/__init__.py +0 -0
  190. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/dictionary.py +0 -0
  191. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/encoding.py +0 -0
  192. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/graphlib/__init__.py +0 -0
  193. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/graphlib/_graphlib.py +0 -0
  194. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/lazy_loader.py +0 -0
  195. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/list.py +0 -0
  196. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/naming.py +0 -0
  197. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/objects.py +0 -0
  198. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/printing.py +0 -0
  199. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/pydantic.py +0 -0
  200. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/repr.py +0 -0
  201. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/sql_values.py +0 -0
  202. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/sync.py +0 -0
  203. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo/utils/warnings.py +0 -0
  204. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo.egg-info/dependency_links.txt +0 -0
  205. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo.egg-info/entry_points.txt +0 -0
  206. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo.egg-info/requires.txt +0 -0
  207. {piccolo-1.17.0 → piccolo-1.18.0}/piccolo.egg-info/top_level.txt +0 -0
  208. {piccolo-1.17.0 → piccolo-1.18.0}/profiling/__init__.py +0 -0
  209. {piccolo-1.17.0 → piccolo-1.18.0}/profiling/run_profile.py +0 -0
  210. {piccolo-1.17.0 → piccolo-1.18.0}/pyproject.toml +0 -0
  211. {piccolo-1.17.0 → piccolo-1.18.0}/setup.cfg +0 -0
  212. {piccolo-1.17.0 → piccolo-1.18.0}/setup.py +0 -0
  213. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/__init__.py +0 -0
  214. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/app/__init__.py +0 -0
  215. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/app/commands/__init__.py +0 -0
  216. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/app/commands/test_new.py +0 -0
  217. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/app/commands/test_show_all.py +0 -0
  218. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/asgi/__init__.py +0 -0
  219. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/asgi/commands/__init__.py +0 -0
  220. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/asgi/commands/test_new.py +0 -0
  221. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/fixtures/__init__.py +0 -0
  222. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/fixtures/commands/__init__.py +0 -0
  223. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/fixtures/commands/test_dump_load.py +0 -0
  224. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/fixtures/commands/test_shared.py +0 -0
  225. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/meta/__init__.py +0 -0
  226. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/meta/commands/__init__.py +0 -0
  227. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/meta/commands/test_version.py +0 -0
  228. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/__init__.py +0 -0
  229. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/auto/__init__.py +0 -0
  230. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/auto/integration/__init__.py +0 -0
  231. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/auto/test_migration_manager.py +0 -0
  232. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/auto/test_schema_differ.py +0 -0
  233. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/auto/test_schema_snapshot.py +0 -0
  234. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/auto/test_serialisation.py +0 -0
  235. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/commands/__init__.py +0 -0
  236. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/commands/test_base.py +0 -0
  237. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/commands/test_check.py +0 -0
  238. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/commands/test_clean.py +0 -0
  239. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/commands/test_forwards_backwards.py +0 -0
  240. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/commands/test_migrations/2020-03-31T20-38-22.py +0 -0
  241. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/commands/test_migrations/__init__.py +0 -0
  242. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/commands/test_new.py +0 -0
  243. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/migrations/test_migration.py +0 -0
  244. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/project/__init__.py +0 -0
  245. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/project/commands/__init__.py +0 -0
  246. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/project/commands/test_new.py +0 -0
  247. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/schema/__init__.py +0 -0
  248. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/shell/__init__.py +0 -0
  249. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/shell/commands/__init__.py +0 -0
  250. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/shell/commands/test_run.py +0 -0
  251. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/sql_shell/__init__.py +0 -0
  252. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/sql_shell/commands/__init__.py +0 -0
  253. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/sql_shell/commands/test_run.py +0 -0
  254. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/tester/__init__.py +0 -0
  255. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/user/__init__.py +0 -0
  256. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/user/commands/__init__.py +0 -0
  257. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/user/commands/test_change_password.py +0 -0
  258. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/user/commands/test_change_permissions.py +0 -0
  259. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/user/commands/test_create.py +0 -0
  260. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/user/commands/test_list.py +0 -0
  261. {piccolo-1.17.0 → piccolo-1.18.0}/tests/apps/user/test_tables.py +0 -0
  262. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/__init__.py +0 -0
  263. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/m2m/__init__.py +0 -0
  264. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/m2m/base.py +0 -0
  265. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/m2m/test_m2m.py +0 -0
  266. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/m2m/test_m2m_schema.py +0 -0
  267. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_array.py +0 -0
  268. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_base.py +0 -0
  269. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_bigint.py +0 -0
  270. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_boolean.py +0 -0
  271. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_bytea.py +0 -0
  272. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_choices.py +0 -0
  273. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_combination.py +0 -0
  274. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_date.py +0 -0
  275. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_db_column_name.py +0 -0
  276. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_defaults.py +0 -0
  277. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_double_precision.py +0 -0
  278. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_get_sql_value.py +0 -0
  279. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_interval.py +0 -0
  280. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_json.py +0 -0
  281. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_jsonb.py +0 -0
  282. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_numeric.py +0 -0
  283. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_primary_key.py +0 -0
  284. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_readable.py +0 -0
  285. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_real.py +0 -0
  286. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_reference.py +0 -0
  287. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_reserved_column_names.py +0 -0
  288. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_smallint.py +0 -0
  289. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_time.py +0 -0
  290. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_timestamp.py +0 -0
  291. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_timestamptz.py +0 -0
  292. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_uuid.py +0 -0
  293. {piccolo-1.17.0 → piccolo-1.18.0}/tests/columns/test_varchar.py +0 -0
  294. {piccolo-1.17.0 → piccolo-1.18.0}/tests/conf/__init__.py +0 -0
  295. {piccolo-1.17.0 → piccolo-1.18.0}/tests/conf/example.py +0 -0
  296. {piccolo-1.17.0 → piccolo-1.18.0}/tests/conf/test_apps.py +0 -0
  297. {piccolo-1.17.0 → piccolo-1.18.0}/tests/engine/__init__.py +0 -0
  298. {piccolo-1.17.0 → piccolo-1.18.0}/tests/engine/test_extra_nodes.py +0 -0
  299. {piccolo-1.17.0 → piccolo-1.18.0}/tests/engine/test_logging.py +0 -0
  300. {piccolo-1.17.0 → piccolo-1.18.0}/tests/engine/test_nested_transaction.py +0 -0
  301. {piccolo-1.17.0 → piccolo-1.18.0}/tests/engine/test_pool.py +0 -0
  302. {piccolo-1.17.0 → piccolo-1.18.0}/tests/engine/test_transaction.py +0 -0
  303. {piccolo-1.17.0 → piccolo-1.18.0}/tests/engine/test_version_parsing.py +0 -0
  304. {piccolo-1.17.0 → piccolo-1.18.0}/tests/example_apps/__init__.py +0 -0
  305. {piccolo-1.17.0 → piccolo-1.18.0}/tests/example_apps/mega/__init__.py +0 -0
  306. {piccolo-1.17.0 → piccolo-1.18.0}/tests/example_apps/mega/piccolo_app.py +0 -0
  307. {piccolo-1.17.0 → piccolo-1.18.0}/tests/example_apps/mega/piccolo_migrations/2021-09-20T21-23-25-698988.py +0 -0
  308. {piccolo-1.17.0 → piccolo-1.18.0}/tests/example_apps/mega/piccolo_migrations/__init__.py +0 -0
  309. {piccolo-1.17.0 → piccolo-1.18.0}/tests/example_apps/mega/tables.py +0 -0
  310. {piccolo-1.17.0 → piccolo-1.18.0}/tests/example_apps/music/__init__.py +0 -0
  311. {piccolo-1.17.0 → piccolo-1.18.0}/tests/example_apps/music/piccolo_app.py +0 -0
  312. {piccolo-1.17.0 → piccolo-1.18.0}/tests/example_apps/music/tables.py +0 -0
  313. {piccolo-1.17.0 → piccolo-1.18.0}/tests/example_apps/music/tables_detailed.py +0 -0
  314. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/__init__.py +0 -0
  315. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/functions/__init__.py +0 -0
  316. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/functions/base.py +0 -0
  317. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/functions/test_datetime.py +0 -0
  318. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/functions/test_functions.py +0 -0
  319. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/functions/test_math.py +0 -0
  320. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/functions/test_string.py +0 -0
  321. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/functions/test_type_conversion.py +0 -0
  322. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/mixins/__init__.py +0 -0
  323. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/mixins/test_columns_delegate.py +0 -0
  324. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/mixins/test_order_by_delegate.py +0 -0
  325. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/test_await.py +0 -0
  326. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/test_camelcase.py +0 -0
  327. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/test_freeze.py +0 -0
  328. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/test_gather.py +0 -0
  329. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/test_querystring.py +0 -0
  330. {piccolo-1.17.0 → piccolo-1.18.0}/tests/query/test_slots.py +0 -0
  331. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/__init__.py +0 -0
  332. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/instance/__init__.py +0 -0
  333. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/instance/test_create.py +0 -0
  334. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/instance/test_get_related.py +0 -0
  335. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/instance/test_get_related_readable.py +0 -0
  336. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/instance/test_instantiate.py +0 -0
  337. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/instance/test_remove.py +0 -0
  338. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/instance/test_save.py +0 -0
  339. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/instance/test_to_dict.py +0 -0
  340. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_all_columns.py +0 -0
  341. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_alter.py +0 -0
  342. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_callback.py +0 -0
  343. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_constructor.py +0 -0
  344. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_count.py +0 -0
  345. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_create.py +0 -0
  346. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_create_db_tables.py +0 -0
  347. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_create_table_class.py +0 -0
  348. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_delete.py +0 -0
  349. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_drop_db_tables.py +0 -0
  350. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_exists.py +0 -0
  351. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_from_dict.py +0 -0
  352. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_indexes.py +0 -0
  353. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_inheritance.py +0 -0
  354. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_insert.py +0 -0
  355. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_join.py +0 -0
  356. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_join_on.py +0 -0
  357. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_metaclass.py +0 -0
  358. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_objects.py +0 -0
  359. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_output.py +0 -0
  360. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_raw.py +0 -0
  361. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_ref.py +0 -0
  362. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_refresh.py +0 -0
  363. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_repr.py +0 -0
  364. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_select.py +0 -0
  365. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_str.py +0 -0
  366. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_table_exists.py +0 -0
  367. {piccolo-1.17.0 → piccolo-1.18.0}/tests/table/test_update.py +0 -0
  368. {piccolo-1.17.0 → piccolo-1.18.0}/tests/test_main.py +0 -0
  369. {piccolo-1.17.0 → piccolo-1.18.0}/tests/test_schema.py +0 -0
  370. {piccolo-1.17.0 → piccolo-1.18.0}/tests/testing/__init__.py +0 -0
  371. {piccolo-1.17.0 → piccolo-1.18.0}/tests/testing/test_model_builder.py +0 -0
  372. {piccolo-1.17.0 → piccolo-1.18.0}/tests/testing/test_random_builder.py +0 -0
  373. {piccolo-1.17.0 → piccolo-1.18.0}/tests/testing/test_test_case.py +0 -0
  374. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/__init__.py +0 -0
  375. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_dictionary.py +0 -0
  376. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_encoding.py +0 -0
  377. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_lazy_loader.py +0 -0
  378. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_list.py +0 -0
  379. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_naming.py +0 -0
  380. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_printing.py +0 -0
  381. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_pydantic.py +0 -0
  382. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_sql_values.py +0 -0
  383. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_sync.py +0 -0
  384. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_table_reflection.py +0 -0
  385. {piccolo-1.17.0 → piccolo-1.18.0}/tests/utils/test_warnings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: piccolo
3
- Version: 1.17.0
3
+ Version: 1.18.0
4
4
  Summary: A fast, user friendly ORM and query builder which supports asyncio.
5
5
  Home-page: https://github.com/piccolo-orm/piccolo
6
6
  Author: Daniel Townsend
@@ -0,0 +1 @@
1
+ __VERSION__ = "1.18.0"
@@ -15,7 +15,7 @@ ROUTER_DEPENDENCIES = {
15
15
  "fastapi": ["fastapi>=0.112.1"],
16
16
  "blacksheep": ["blacksheep"],
17
17
  "litestar": ["litestar"],
18
- "esmerald": ["esmerald"],
18
+ "esmerald": ["esmerald==3.3.0"],
19
19
  "lilya": ["lilya"],
20
20
  }
21
21
  ROUTERS = list(ROUTER_DEPENDENCIES.keys())
@@ -40,10 +40,17 @@ def compare_dicts(
40
40
 
41
41
  for key, value in dict_1.items():
42
42
  dict_2_value = dict_2.get(key, ...)
43
+
43
44
  if (
44
- dict_2_value is not ...
45
- and dict_2_value != value
46
- or dict_2_value is ...
45
+ # If the value is `...` then it means no value was found.
46
+ (dict_2_value is ...)
47
+ # We have to compare the types, because if we just use equality
48
+ # then 1.0 == 1 is True.
49
+ # See this issue:
50
+ # https://github.com/piccolo-orm/piccolo/issues/1071
51
+ or (type(value) is not type(dict_2_value))
52
+ # Finally compare the actual values.
53
+ or (dict_2_value != value)
47
54
  ):
48
55
  output[key] = value
49
56
 
@@ -27,6 +27,7 @@ from piccolo.utils.sync import run_sync
27
27
 
28
28
  if t.TYPE_CHECKING: # pragma: no cover
29
29
  from piccolo.columns import Column
30
+ from piccolo.table import Table
30
31
 
31
32
 
32
33
  ###############################################################################
@@ -173,6 +174,61 @@ class Create(t.Generic[TableInstance]):
173
174
  return run_sync(self.run(*args, **kwargs))
174
175
 
175
176
 
177
+ class UpdateSelf:
178
+
179
+ def __init__(
180
+ self,
181
+ row: Table,
182
+ values: t.Dict[t.Union[Column, str], t.Any],
183
+ ):
184
+ self.row = row
185
+ self.values = values
186
+
187
+ async def run(
188
+ self,
189
+ node: t.Optional[str] = None,
190
+ in_pool: bool = True,
191
+ ) -> None:
192
+ if not self.row._exists_in_db:
193
+ raise ValueError("This row doesn't exist in the database.")
194
+
195
+ TableClass = self.row.__class__
196
+
197
+ primary_key = TableClass._meta.primary_key
198
+ primary_key_value = getattr(self.row, primary_key._meta.name)
199
+
200
+ if primary_key_value is None:
201
+ raise ValueError("The primary key is None")
202
+
203
+ columns = [
204
+ TableClass._meta.get_column_by_name(i) if isinstance(i, str) else i
205
+ for i in self.values.keys()
206
+ ]
207
+
208
+ response = (
209
+ await TableClass.update(self.values)
210
+ .where(primary_key == primary_key_value)
211
+ .returning(*columns)
212
+ .run(
213
+ node=node,
214
+ in_pool=in_pool,
215
+ )
216
+ )
217
+
218
+ for key, value in response[0].items():
219
+ setattr(self.row, key, value)
220
+
221
+ def __await__(self) -> t.Generator[None, None, None]:
222
+ """
223
+ If the user doesn't explicity call .run(), proxy to it as a
224
+ convenience.
225
+ """
226
+ return self.run().__await__()
227
+
228
+ def run_sync(self, *args, **kwargs) -> None:
229
+ return run_sync(self.run(*args, **kwargs))
230
+
231
+
176
232
  ###############################################################################
177
233
 
178
234
 
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import typing as t
4
4
 
5
+ from piccolo.engine.base import BaseBatch
5
6
  from piccolo.query.base import Query
6
7
  from piccolo.querystring import QueryString
7
8
 
@@ -21,6 +22,18 @@ class Raw(Query):
21
22
  super().__init__(table, **kwargs)
22
23
  self.querystring = querystring
23
24
 
25
+ async def batch(
26
+ self,
27
+ batch_size: t.Optional[int] = None,
28
+ node: t.Optional[str] = None,
29
+ **kwargs,
30
+ ) -> BaseBatch:
31
+ if batch_size:
32
+ kwargs.update(batch_size=batch_size)
33
+ if node:
34
+ kwargs.update(node=node)
35
+ return await self.table._meta.db.batch(self, **kwargs)
36
+
24
37
  @property
25
38
  def default_querystrings(self) -> t.Sequence[QueryString]:
26
39
  return [self.querystring]
@@ -46,7 +46,7 @@ from piccolo.query import (
46
46
  )
47
47
  from piccolo.query.methods.create_index import CreateIndex
48
48
  from piccolo.query.methods.indexes import Indexes
49
- from piccolo.query.methods.objects import First
49
+ from piccolo.query.methods.objects import First, UpdateSelf
50
50
  from piccolo.query.methods.refresh import Refresh
51
51
  from piccolo.querystring import QueryString
52
52
  from piccolo.utils import _camel_to_snake
@@ -525,6 +525,43 @@ class Table(metaclass=TableMetaclass):
525
525
  == getattr(self, self._meta.primary_key._meta.name)
526
526
  )
527
527
 
528
+ def update_self(
529
+ self, values: t.Dict[t.Union[Column, str], t.Any]
530
+ ) -> UpdateSelf:
531
+ """
532
+ This allows the user to update a single object - useful when the values
533
+ are derived from the database in some way.
534
+
535
+ For example, if we have the following table::
536
+
537
+ class Band(Table):
538
+ name = Varchar()
539
+ popularity = Integer()
540
+
541
+ And we fetch an object::
542
+
543
+ >>> band = await Band.objects().get(name="Pythonistas")
544
+
545
+ We could use the typical syntax for updating the object::
546
+
547
+ >>> band.popularity += 1
548
+ >>> await band.save()
549
+
550
+ The problem with this, is what if another object has already
551
+ incremented ``popularity``? It would overide the value.
552
+
553
+ Instead we can do this:
554
+
555
+ >>> await band.update_self({
556
+ ... Band.popularity: Band.popularity + 1
557
+ ... })
558
+
559
+ This updates ``popularity`` in the database, and also sets the new
560
+ value for ``popularity`` on the object.
561
+
562
+ """
563
+ return UpdateSelf(row=self, values=values)
564
+
528
565
  def remove(self) -> Delete:
529
566
  """
530
567
  A proxy to a delete query.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: piccolo
3
- Version: 1.17.0
3
+ Version: 1.18.0
4
4
  Summary: A fast, user friendly ORM and query builder which supports asyncio.
5
5
  Home-page: https://github.com/piccolo-orm/piccolo
6
6
  Author: Daniel Townsend
@@ -355,6 +355,7 @@ tests/table/test_select.py
355
355
  tests/table/test_str.py
356
356
  tests/table/test_table_exists.py
357
357
  tests/table/test_update.py
358
+ tests/table/test_update_self.py
358
359
  tests/table/instance/__init__.py
359
360
  tests/table/instance/test_create.py
360
361
  tests/table/instance/test_get_related.py
@@ -888,6 +888,25 @@ class TestMigrations(MigrationTestCase):
888
888
  ]
889
889
  )
890
890
 
891
+ def test_column_type_conversion_integer_float(self):
892
+ """
893
+ Make sure conversion between ``Integer`` and ``Real`` works - related
894
+ to this bug:
895
+
896
+ https://github.com/piccolo-orm/piccolo/issues/1071
897
+
898
+ """
899
+ self._test_migrations(
900
+ table_snapshots=[
901
+ [self.table(column)]
902
+ for column in [
903
+ Real(default=1.0),
904
+ Integer(default=1),
905
+ Real(default=1.0),
906
+ ]
907
+ ]
908
+ )
909
+
891
910
  def test_column_type_conversion_json(self):
892
911
  self._test_migrations(
893
912
  table_snapshots=[
@@ -73,6 +73,19 @@ class TestCompareDicts(TestCase):
73
73
  response = compare_dicts(dict_1, dict_2)
74
74
  self.assertEqual(response, {"a": OnDelete.set_default})
75
75
 
76
+ def test_numeric_values(self):
77
+ """
78
+ Make sure that if we have two numbers which are equal, but different
79
+ types, then they are identified as being different.
80
+
81
+ https://github.com/piccolo-orm/piccolo/issues/1071
82
+
83
+ """
84
+ dict_1 = {"a": 1}
85
+ dict_2 = {"a": 1.0}
86
+ response = compare_dicts(dict_1, dict_2)
87
+ self.assertEqual(response, {"a": 1})
88
+
76
89
 
77
90
  class TestDiffableTable(TestCase):
78
91
  def test_subtract(self):
@@ -95,6 +95,47 @@ class TestBatchObjects(DBTestCase):
95
95
  self.assertEqual(iterations, _iterations)
96
96
 
97
97
 
98
+ class TestBatchRaw(DBTestCase):
99
+ def _check_results(self, batch):
100
+ """
101
+ Make sure the data is returned in the correct format.
102
+ """
103
+ self.assertEqual(type(batch), list)
104
+ if len(batch) > 0:
105
+ row = batch[0]
106
+ self.assertIsInstance(row, Manager)
107
+
108
+ async def run_batch(self, batch_size):
109
+ row_count = 0
110
+ iterations = 0
111
+
112
+ async with await Manager.raw("SELECT * FROM manager").batch(
113
+ batch_size=batch_size
114
+ ) as batch:
115
+ async for _batch in batch:
116
+ self._check_results(_batch)
117
+ _row_count = len(_batch)
118
+ row_count += _row_count
119
+ iterations += 1
120
+
121
+ return row_count, iterations
122
+
123
+ async def test_batch(self):
124
+ row_count = 1000
125
+ self.insert_many_rows(row_count)
126
+
127
+ batch_size = 10
128
+
129
+ _row_count, iterations = asyncio.run(
130
+ self.run_batch(batch_size=batch_size), debug=True
131
+ )
132
+
133
+ _iterations = math.ceil(row_count / batch_size)
134
+
135
+ self.assertEqual(_row_count, row_count)
136
+ self.assertEqual(iterations, _iterations)
137
+
138
+
98
139
  @engines_only("postgres", "cockroach")
99
140
  class TestBatchNodeArg(TestCase):
100
141
  def test_batch_extra_node(self):
@@ -0,0 +1,27 @@
1
+ from piccolo.testing.test_case import AsyncTableTest
2
+ from tests.example_apps.music.tables import Band, Manager
3
+
4
+
5
+ class TestUpdateSelf(AsyncTableTest):
6
+
7
+ tables = [Band, Manager]
8
+
9
+ async def test_update_self(self):
10
+ band = Band({Band.name: "Pythonistas", Band.popularity: 1000})
11
+
12
+ # Make sure we get a ValueError if it's not in the database yet.
13
+ with self.assertRaises(ValueError):
14
+ await band.update_self({Band.popularity: Band.popularity + 1})
15
+
16
+ # Save it, so it's in the database
17
+ await band.save()
18
+
19
+ # Make sure we can successfully update the object
20
+ await band.update_self({Band.popularity: Band.popularity + 1})
21
+
22
+ # Make sure the value was updated on the object
23
+ assert band.popularity == 1001
24
+
25
+ # Make sure the value was updated in the database
26
+ await band.refresh()
27
+ assert band.popularity == 1001
@@ -1 +0,0 @@
1
- __VERSION__ = "1.17.0"
File without changes
File without changes