piccolo 1.12.0__py3-none-any.whl → 1.13.1__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.
piccolo/__init__.py CHANGED
@@ -1 +1 @@
1
- __VERSION__ = "1.12.0"
1
+ __VERSION__ = "1.13.1"
@@ -363,7 +363,7 @@ class Email(Varchar):
363
363
  Used for storing email addresses. It's identical to :class:`Varchar`,
364
364
  except when using :func:`create_pydantic_model <piccolo.utils.pydantic.create_pydantic_model>` -
365
365
  we add email validation to the Pydantic model. This means that :ref:`PiccoloAdmin`
366
- also validates emails addresses.
366
+ also validates email addresses.
367
367
  """ # noqa: E501
368
368
 
369
369
  pass
@@ -2183,7 +2183,7 @@ class ForeignKey(Column, t.Generic[ReferencedTable]):
2183
2183
  # If the ForeignKey is using a lazy reference, we need to set the
2184
2184
  # attributes here. Attributes starting with an underscore are
2185
2185
  # unlikely to be column names.
2186
- if not name.startswith("__"):
2186
+ if not name.startswith("_") and name not in dir(self):
2187
2187
  try:
2188
2188
  _foreign_key_meta = object.__getattribute__(
2189
2189
  self, "_foreign_key_meta"
@@ -2196,12 +2196,9 @@ class ForeignKey(Column, t.Generic[ReferencedTable]):
2196
2196
  ):
2197
2197
  object.__getattribute__(self, "set_proxy_columns")()
2198
2198
 
2199
- try:
2200
- value = object.__getattribute__(self, name)
2201
- except AttributeError:
2202
- raise AttributeError
2199
+ value = object.__getattribute__(self, name)
2203
2200
 
2204
- if name == "_":
2201
+ if name.startswith("_"):
2205
2202
  return value
2206
2203
 
2207
2204
  foreignkey_class: t.Type[ForeignKey] = object.__getattribute__(
@@ -30,6 +30,9 @@ class LazyTableReference:
30
30
  If specified, the ``Table`` subclass is imported from this path.
31
31
  For example, ``'my_app.tables'``.
32
32
 
33
+ .. hint::
34
+ If the table is in the same file, you can pass in ``__name__``.
35
+
33
36
  """
34
37
 
35
38
  table_class_name: str
@@ -36,7 +36,13 @@ if t.TYPE_CHECKING: # pragma: no cover
36
36
  from piccolo.table import Table # noqa
37
37
 
38
38
  # Here to avoid breaking changes - will be removed in the future.
39
- from piccolo.query.functions.aggregate import Count # noqa: F401
39
+ from piccolo.query.functions.aggregate import ( # noqa: F401
40
+ Avg,
41
+ Count,
42
+ Max,
43
+ Min,
44
+ Sum,
45
+ )
40
46
 
41
47
 
42
48
  class SelectRaw(Selectable):
piccolo/utils/pydantic.py CHANGED
@@ -206,7 +206,7 @@ def create_pydantic_model(
206
206
  ###########################################################################
207
207
 
208
208
  columns: t.Dict[str, t.Any] = {}
209
- validators: t.Dict[str, classmethod] = {}
209
+ validators: t.Dict[str, t.Callable] = {}
210
210
 
211
211
  piccolo_columns = tuple(
212
212
  table._meta.columns
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: piccolo
3
- Version: 1.12.0
3
+ Version: 1.13.1
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
@@ -1,4 +1,4 @@
1
- piccolo/__init__.py,sha256=VUvL_fuJC_-uD36JTR5DMXk6zqaYLgxYWHSlIeRP_aQ,23
1
+ piccolo/__init__.py,sha256=GrBPNCkQ6kXrEUyia6uQya9mMG0d8ZP4735lda-dt_s,23
2
2
  piccolo/custom_types.py,sha256=7HMQAze-5mieNLfbQ5QgbRQgR2abR7ol0qehv2SqROY,604
3
3
  piccolo/main.py,sha256=1VsFV67FWTUikPTysp64Fmgd9QBVa_9wcwKfwj2UCEA,5117
4
4
  piccolo/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -117,12 +117,12 @@ piccolo/apps/user/piccolo_migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
117
117
  piccolo/columns/__init__.py,sha256=OYhO_n9anMiU9nL-K6ATq9FhAtm8RyMpqYQ7fTVbhxI,1120
118
118
  piccolo/columns/base.py,sha256=sgMiBvq-xLW6_W86g6XZTMc_3cskyeoMF6yIvIlnXsA,32487
119
119
  piccolo/columns/choices.py,sha256=-HNQuk9vMmVZIPZ5PMeXGTfr23o4nzKPSAkvcG1k0y8,723
120
- piccolo/columns/column_types.py,sha256=82JmKDrZ0bh1Jal0HOeu-Q9HzZaWs4liUoyJa9OoJFQ,83533
120
+ piccolo/columns/column_types.py,sha256=X_ZsA0C4WBNVonV2OsizRdt1osMshgtQ3Ob6JN-amfg,83485
121
121
  piccolo/columns/combination.py,sha256=vMXC2dfY7pvnCFhsT71XFVyb4gdQzfRsCMaiduu04Ss,6900
122
122
  piccolo/columns/indexes.py,sha256=NfNok3v_791jgDlN28KmhP9ZCjl6031BXmjxV3ovXJk,372
123
123
  piccolo/columns/m2m.py,sha256=17NY0wU7ta2rUTHYUkeA2HQhTDlJ_lyv9FxqvJiiUbY,14602
124
124
  piccolo/columns/readable.py,sha256=hganxUPfIK5ZXn-qgteBxsOJfBJucgr9U0QLsLFYcuI,1562
125
- piccolo/columns/reference.py,sha256=FqE9rpMBMwNNkKXR3Wi4ce-fyT2Vh4KM8YpdC21s6gg,3574
125
+ piccolo/columns/reference.py,sha256=n4SW5CGrUSwsRk2Pm7UbikmKdUHuJ2D5OobQ7Mea1vQ,3669
126
126
  piccolo/columns/defaults/__init__.py,sha256=7hpB13baEJgc1zbZjRKDFr-5hltxM2VGj8KnKfOiS8c,145
127
127
  piccolo/columns/defaults/base.py,sha256=z_ZgtSFbLuwqdYdI7dr2n1SeyTJ7M4Ee4Ki7eRaBlVA,1869
128
128
  piccolo/columns/defaults/date.py,sha256=Duuyi-QJ9Rr72aJkCNnjyO1CJBE-inZNGKnyV8tbLLE,2517
@@ -169,7 +169,7 @@ piccolo/query/methods/insert.py,sha256=ssLJ_wn08KnOwwr7t-VILyn1P4hrvM63CfPIcAJWT
169
169
  piccolo/query/methods/objects.py,sha256=iahDUziUtlx7pJ2uBAhdm3hCTmg2AS9C8cal1my5KR0,11705
170
170
  piccolo/query/methods/raw.py,sha256=VhYpCB52mZk4zqFTsqK5CHKTDGskUjISXTBV7UjohmA,600
171
171
  piccolo/query/methods/refresh.py,sha256=P1Eo_HYU_L7kcGM_cvDDgyLi1boCXY7Pc4tv_eDAzvc,2769
172
- piccolo/query/methods/select.py,sha256=DjiTTyqoh95nK0m6Ru3UKjzybe1S5JlfeJ9IB2xR4VI,21270
172
+ piccolo/query/methods/select.py,sha256=YkCYeFk6oSKGy_TrMXzgYiAI_me-9iw-tppfb7EYU5c,21315
173
173
  piccolo/query/methods/table_exists.py,sha256=0yb3n6Jd2ovSBWlZ-gl00K4E7Jnbj7J8qAAX5d7hvNk,1259
174
174
  piccolo/query/methods/update.py,sha256=LfWqIXEl1aecc0rkVssTFmwyD6wXGhlKcTrUVhtlEsw,3705
175
175
  piccolo/testing/__init__.py,sha256=pRFSqRInfx95AakOq54atmvqoB-ue073q2aR8u8zR40,83
@@ -183,7 +183,7 @@ piccolo/utils/list.py,sha256=4hPGiksJWxL226W7gyYBcqVGgMTgVa2jP8zvalc3zw8,1541
183
183
  piccolo/utils/naming.py,sha256=d7_mMscguK799RMhxFDifRgn8Ply5wiy2k1KkP22WUs,276
184
184
  piccolo/utils/objects.py,sha256=NjhfH57Q__1xSf4gvLtZFle3Lp0PiqPR7AcsVhkA3MY,1631
185
185
  piccolo/utils/printing.py,sha256=5VWNSfOrIGPh1VM-7fd4K18RGCYk0FQ5o-D4aLhzXZE,1748
186
- piccolo/utils/pydantic.py,sha256=_8jzsZQioBIziriMJauma2Fto8jhP0qoi4mob2LM-NA,12328
186
+ piccolo/utils/pydantic.py,sha256=RhoQZ7ddmFmepVcslHXMqmynbSVch7XLKUSgJkLuQS0,12327
187
187
  piccolo/utils/repr.py,sha256=K3w-TAP9WPx8tbAIB2XDab_C4PHsPrB9TzwWfOHa4cc,787
188
188
  piccolo/utils/sql_values.py,sha256=pGXmVTw6pWr8q7QA4xs7NiKSwjBzhN--3HXVjQv2SQQ,1749
189
189
  piccolo/utils/sync.py,sha256=j9Abkxn5HHS6HyvfpMzb1zV_teTkFHVhaIxu9rrSwSU,819
@@ -263,7 +263,7 @@ tests/columns/test_numeric.py,sha256=WrilQrWc-_g8DGLUvmllSBL01xqYqDORt3ypplnRizA
263
263
  tests/columns/test_primary_key.py,sha256=hXnTF-kFgrFNjawvJstmR3YQCM59qJ4NWkMD9vRY8FI,4871
264
264
  tests/columns/test_readable.py,sha256=OFK2n_k-eqRLdjEg1X2aOFPNwhtGDPNBli4DAh3i6vw,743
265
265
  tests/columns/test_real.py,sha256=bSjACkbnJzrN9dEWVb0UdWqSDfxdGz5HMWc8PUsJUl4,496
266
- tests/columns/test_reference.py,sha256=I_gjICtJ7bE2cBrmCv-kz25AvI922A3pizRVIhHpzSE,1508
266
+ tests/columns/test_reference.py,sha256=d7vm7AHinISA-HjlA8zyPCRaAGPtnc5NOXUvK4SeQFg,2329
267
267
  tests/columns/test_reserved_column_names.py,sha256=BpqN49n_AaiPjaaJ43hLhFXQHb8NV6ig8nvgKvN0Smc,1404
268
268
  tests/columns/test_smallint.py,sha256=t-LNX7XXy-k5_lhGXwELyC0LB9Iq4WrBVQdvEYf5EaQ,984
269
269
  tests/columns/test_time.py,sha256=qyG4jjSO_B2DfkjQo3nIff2T201c75EI7M6CYspK5QM,1560
@@ -365,9 +365,9 @@ tests/utils/test_sql_values.py,sha256=vzxRmy16FfLZPH-sAQexBvsF9MXB8n4smr14qoEOS5
365
365
  tests/utils/test_sync.py,sha256=9ytVo56y2vPQePvTeIi9lHIouEhWJbodl1TmzkGFrSo,799
366
366
  tests/utils/test_table_reflection.py,sha256=SIzuat-IpcVj1GCFyOWKShI8YkhdOPPFH7qVrvfyPNE,3794
367
367
  tests/utils/test_warnings.py,sha256=NvSC_cvJ6uZcwAGf1m-hLzETXCqprXELL8zg3TNLVMw,269
368
- piccolo-1.12.0.dist-info/LICENSE,sha256=zFIpi-16uIJ420UMIG75NU0JbDBykvrdnXcj5U_EYBI,1059
369
- piccolo-1.12.0.dist-info/METADATA,sha256=255a7LoWzwC58EKwF0kgMAONG47eqD5AuHdwt8rtEUs,5150
370
- piccolo-1.12.0.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
371
- piccolo-1.12.0.dist-info/entry_points.txt,sha256=SJPHET4Fi1bN5F3WqcKkv9SClK3_F1I7m4eQjk6AFh0,46
372
- piccolo-1.12.0.dist-info/top_level.txt,sha256=-SR74VGbk43VoPy1HH-mHm97yoGukLK87HE5kdBW6qM,24
373
- piccolo-1.12.0.dist-info/RECORD,,
368
+ piccolo-1.13.1.dist-info/LICENSE,sha256=zFIpi-16uIJ420UMIG75NU0JbDBykvrdnXcj5U_EYBI,1059
369
+ piccolo-1.13.1.dist-info/METADATA,sha256=flDNQ_SrNtwPmzGu18J_ws5E1UqSZcKFKJ2C3PA0XpM,5150
370
+ piccolo-1.13.1.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
371
+ piccolo-1.13.1.dist-info/entry_points.txt,sha256=SJPHET4Fi1bN5F3WqcKkv9SClK3_F1I7m4eQjk6AFh0,46
372
+ piccolo-1.13.1.dist-info/top_level.txt,sha256=-SR74VGbk43VoPy1HH-mHm97yoGukLK87HE5kdBW6qM,24
373
+ piccolo-1.13.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.1.0)
2
+ Generator: setuptools (70.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -5,10 +5,41 @@ piccolo/columns/test_foreignkey.py
5
5
 
6
6
  from unittest import TestCase
7
7
 
8
+ from piccolo.columns import ForeignKey, Varchar
8
9
  from piccolo.columns.reference import LazyTableReference
10
+ from piccolo.table import Table
11
+ from tests.base import TableTest
9
12
 
10
13
 
11
- class TestLazyTableReference(TestCase):
14
+ class Band(Table):
15
+ manager: ForeignKey["Manager"] = ForeignKey(
16
+ LazyTableReference("Manager", module_path=__name__)
17
+ )
18
+ name = Varchar()
19
+
20
+
21
+ class Manager(Table):
22
+ name = Varchar()
23
+
24
+
25
+ class TestQueries(TableTest):
26
+ tables = [Band, Manager]
27
+
28
+ def setUp(self):
29
+ super().setUp()
30
+ manager = Manager({Manager.name: "Guido"})
31
+ manager.save().run_sync()
32
+ band = Band({Band.name: "Pythonistas", Band.manager: manager})
33
+ band.save().run_sync()
34
+
35
+ def test_select(self):
36
+ self.assertListEqual(
37
+ Band.select(Band.name, Band.manager._.name).run_sync(),
38
+ [{"name": "Pythonistas", "manager.name": "Guido"}],
39
+ )
40
+
41
+
42
+ class TestInit(TestCase):
12
43
  def test_init(self):
13
44
  """
14
45
  A ``LazyTableReference`` must be passed either an ``app_name`` or
@@ -34,6 +65,8 @@ class TestLazyTableReference(TestCase):
34
65
  module_path="tests.example_apps.music.tables",
35
66
  )
36
67
 
68
+
69
+ class TestStr(TestCase):
37
70
  def test_str(self):
38
71
  self.assertEqual(
39
72
  LazyTableReference(