@ai-devtools/dbspec-macos-arm64 1.6.2 → 1.6.4

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 (53) hide show
  1. package/bin/dbspec/_internal/base_library.zip +0 -0
  2. package/bin/dbspec/_internal/dbspec.egg-info/PKG-INFO +10 -2
  3. package/bin/dbspec/_internal/dbspec.egg-info/SOURCES.txt +7 -0
  4. package/bin/dbspec/_internal/dbspec.egg-info/requires.txt +1 -0
  5. package/bin/dbspec/_internal/libcom_err.3.0.dylib +0 -0
  6. package/bin/dbspec/_internal/libcrypto.3.dylib +0 -0
  7. package/bin/dbspec/_internal/libgssapi_krb5.2.2.dylib +0 -0
  8. package/bin/dbspec/_internal/libk5crypto.3.1.dylib +0 -0
  9. package/bin/dbspec/_internal/libkrb5.3.3.dylib +0 -0
  10. package/bin/dbspec/_internal/libkrb5support.1.1.dylib +0 -0
  11. package/bin/dbspec/_internal/liblber.2.dylib +0 -0
  12. package/bin/dbspec/_internal/libldap.2.dylib +0 -0
  13. package/bin/dbspec/_internal/{psycopg-3.3.6.dist-info → psycopg-3.3.8.dist-info}/METADATA +3 -3
  14. package/bin/dbspec/_internal/{psycopg-3.3.6.dist-info → psycopg-3.3.8.dist-info}/RECORD +14 -14
  15. package/bin/dbspec/_internal/{psycopg-3.3.6.dist-info → psycopg-3.3.8.dist-info}/WHEEL +1 -1
  16. package/bin/dbspec/_internal/psycopg_binary/.dylibs/libcom_err.3.0.dylib +0 -0
  17. package/bin/dbspec/_internal/psycopg_binary/.dylibs/libcrypto.3.dylib +0 -0
  18. package/bin/dbspec/_internal/psycopg_binary/.dylibs/libgssapi_krb5.2.2.dylib +0 -0
  19. package/bin/dbspec/_internal/psycopg_binary/.dylibs/libk5crypto.3.1.dylib +0 -0
  20. package/bin/dbspec/_internal/psycopg_binary/.dylibs/libkrb5.3.3.dylib +0 -0
  21. package/bin/dbspec/_internal/psycopg_binary/.dylibs/libkrb5support.1.1.dylib +0 -0
  22. package/bin/dbspec/_internal/psycopg_binary/.dylibs/liblber.2.dylib +0 -0
  23. package/bin/dbspec/_internal/psycopg_binary/.dylibs/libldap.2.dylib +0 -0
  24. package/bin/dbspec/_internal/psycopg_binary/_psycopg.cpython-313-darwin.so +0 -0
  25. package/bin/dbspec/_internal/psycopg_binary/pq.cpython-313-darwin.so +0 -0
  26. package/bin/dbspec/_internal/{psycopg_binary-3.3.6.dist-info → psycopg_binary-3.3.8.dist-info}/METADATA +1 -1
  27. package/bin/dbspec/_internal/psycopg_binary-3.3.8.dist-info/RECORD +29 -0
  28. package/bin/dbspec/_internal/{pydantic-2.14.1.dist-info → pydantic-2.14.3.dist-info}/METADATA +105 -2
  29. package/bin/dbspec/_internal/{pydantic-2.14.1.dist-info → pydantic-2.14.3.dist-info}/RECORD +30 -28
  30. package/bin/dbspec/_internal/{pydantic-2.14.1.dist-info → pydantic-2.14.3.dist-info}/WHEEL +1 -1
  31. package/bin/dbspec/_internal/pydantic_core/_pydantic_core.cpython-313-darwin.so +0 -0
  32. package/bin/dbspec/_internal/pyproject.toml +2 -1
  33. package/bin/dbspec/_internal/sqlalchemy/engine/_processors_cy.cpython-313-darwin.so +0 -0
  34. package/bin/dbspec/_internal/sqlalchemy/engine/_result_cy.cpython-313-darwin.so +0 -0
  35. package/bin/dbspec/_internal/sqlalchemy/engine/_row_cy.cpython-313-darwin.so +0 -0
  36. package/bin/dbspec/_internal/sqlalchemy/engine/_util_cy.cpython-313-darwin.so +0 -0
  37. package/bin/dbspec/_internal/sqlalchemy/sql/_cache_key_cy.cpython-313-darwin.so +0 -0
  38. package/bin/dbspec/_internal/sqlalchemy/sql/_util_cy.cpython-313-darwin.so +0 -0
  39. package/bin/dbspec/_internal/sqlalchemy/util/_collections_cy.cpython-313-darwin.so +0 -0
  40. package/bin/dbspec/_internal/sqlalchemy/util/_immutabledict_cy.cpython-313-darwin.so +0 -0
  41. package/bin/dbspec/_internal/src/resources/sqlalchemy_templates/alembic_default_comparator.py.j2 +144 -62
  42. package/bin/dbspec/dbspec +0 -0
  43. package/package.json +1 -1
  44. package/bin/dbspec/_internal/psycopg_binary-3.3.6.dist-info/RECORD +0 -29
  45. /package/bin/dbspec/_internal/{psycopg-3.3.6.dist-info → psycopg-3.3.8.dist-info}/INSTALLER +0 -0
  46. /package/bin/dbspec/_internal/{psycopg-3.3.6.dist-info → psycopg-3.3.8.dist-info}/licenses/LICENSE.txt +0 -0
  47. /package/bin/dbspec/_internal/{psycopg-3.3.6.dist-info → psycopg-3.3.8.dist-info}/top_level.txt +0 -0
  48. /package/bin/dbspec/_internal/{psycopg_binary-3.3.6.dist-info → psycopg_binary-3.3.8.dist-info}/INSTALLER +0 -0
  49. /package/bin/dbspec/_internal/{psycopg_binary-3.3.6.dist-info → psycopg_binary-3.3.8.dist-info}/WHEEL +0 -0
  50. /package/bin/dbspec/_internal/{psycopg_binary-3.3.6.dist-info → psycopg_binary-3.3.8.dist-info}/licenses/LICENSE.txt +0 -0
  51. /package/bin/dbspec/_internal/{psycopg_binary-3.3.6.dist-info → psycopg_binary-3.3.8.dist-info}/top_level.txt +0 -0
  52. /package/bin/dbspec/_internal/{pydantic-2.14.1.dist-info → pydantic-2.14.3.dist-info}/INSTALLER +0 -0
  53. /package/bin/dbspec/_internal/{pydantic-2.14.1.dist-info → pydantic-2.14.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dbspec
3
- Version: 1.6.2
3
+ Version: 1.6.4
4
4
  Summary: DBSpec: CLI/TUI for database design (Excel as DSL)
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -12,6 +12,7 @@ Requires-Dist: sqlalchemy>=2.0.16
12
12
  Requires-Dist: alembic
13
13
  Requires-Dist: psycopg[binary]
14
14
  Requires-Dist: jinja2
15
+ Requires-Dist: tomlkit>=0.13.2
15
16
 
16
17
  # DBSpec
17
18
 
@@ -125,7 +126,14 @@ Migrations user guide: `docs/tui-migrations.md`.
125
126
 
126
127
  ## Configuration
127
128
 
128
- Локальная конфигурация: `.dbspec/config.toml`.
129
+ Общая конфигурация команды: `.dbspec/config.toml` (в Git). Подключение к БД и
130
+ личные настройки: `.dbspec/local.toml` (исключён из Git). Временное состояние TUI
131
+ хранится отдельно в `.dbspec/state.json`.
132
+
133
+ CLI и TUI используют единственный путь моделей `generator.sqlalchemy.output_dir`
134
+ из общего конфига. Изменение пути в TUI сохраняется туда же; локальные настройки
135
+ и state его не перекрывают. Старый смешанный формат не поддерживается: существующие
136
+ конфиги разделяются вручную, без автоматического переноса.
129
137
 
130
138
  Подробнее:
131
139
 
@@ -137,11 +137,15 @@ src/resources/sqlalchemy_templates/package_init.py.j2
137
137
  src/reveng/__init__.py
138
138
  src/storage/__init__.py
139
139
  src/storage/alembic_env_patching.py
140
+ src/storage/alembic_service_table.py
140
141
  src/storage/atomic.py
142
+ src/storage/codegen_config.py
141
143
  src/storage/config.py
144
+ src/storage/config_files.py
142
145
  src/storage/file_utils.py
143
146
  src/storage/init.py
144
147
  src/storage/init_alembic.py
148
+ src/storage/init_config.py
145
149
  src/storage/init_logging.py
146
150
  src/storage/init_resources.py
147
151
  src/storage/init_templates.py
@@ -184,6 +188,7 @@ src/tui/components/header.py
184
188
  src/tui/components/help_overlay.py
185
189
  src/tui/components/init_dialog.py
186
190
  src/tui/components/screen_host.py
191
+ src/tui/components/settings_dialog.py
187
192
  src/tui/components/sidebar.py
188
193
  src/tui/components/status_badge.py
189
194
  src/tui/jobs/__init__.py
@@ -254,6 +259,8 @@ src/tui/styles/__init__.py
254
259
  src/tui/styles/build.py
255
260
  src/tui/styles/tokens.py
256
261
  src/utils/__init__.py
262
+ src/utils/default_comparison.py
263
+ src/utils/default_literals.py
257
264
  src/utils/parsing.py
258
265
  src/utils/postgres_types.py
259
266
  src/utils/progress.py
@@ -6,3 +6,4 @@ sqlalchemy>=2.0.16
6
6
  alembic
7
7
  psycopg[binary]
8
8
  jinja2
9
+ tomlkit>=0.13.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: psycopg
3
- Version: 3.3.6
3
+ Version: 3.3.8
4
4
  Summary: PostgreSQL database adapter for Python
5
5
  Author-email: Daniele Varrazzo <daniele.varrazzo@gmail.com>
6
6
  License-Expression: LGPL-3.0-only
@@ -34,9 +34,9 @@ License-File: LICENSE.txt
34
34
  Requires-Dist: typing-extensions>=4.6; python_version < "3.13"
35
35
  Requires-Dist: tzdata; sys_platform == "win32"
36
36
  Provides-Extra: c
37
- Requires-Dist: psycopg-c==3.3.6; implementation_name != "pypy" and extra == "c"
37
+ Requires-Dist: psycopg-c==3.3.8; implementation_name != "pypy" and extra == "c"
38
38
  Provides-Extra: binary
39
- Requires-Dist: psycopg-binary==3.3.6; implementation_name != "pypy" and extra == "binary"
39
+ Requires-Dist: psycopg-binary==3.3.8; implementation_name != "pypy" and extra == "binary"
40
40
  Provides-Extra: pool
41
41
  Requires-Dist: psycopg-pool; extra == "pool"
42
42
  Provides-Extra: test
@@ -1,9 +1,9 @@
1
- psycopg-3.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
- psycopg-3.3.6.dist-info/METADATA,sha256=NRlgOX1rOGvq6TH1v9lF6MEhLpUFAX0bFcctTDO7AK8,4369
3
- psycopg-3.3.6.dist-info/RECORD,,
4
- psycopg-3.3.6.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
5
- psycopg-3.3.6.dist-info/licenses/LICENSE.txt,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
6
- psycopg-3.3.6.dist-info/top_level.txt,sha256=npthKx2_OEoahttYqdsIPlRUgjS_bQBmfpDCVxQcPGo,8
1
+ psycopg-3.3.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
+ psycopg-3.3.8.dist-info/METADATA,sha256=xQOPeSh8UB19B0tSHd-nEgJGGrG9it4PXcsIjvF-dus,4369
3
+ psycopg-3.3.8.dist-info/RECORD,,
4
+ psycopg-3.3.8.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
5
+ psycopg-3.3.8.dist-info/licenses/LICENSE.txt,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
6
+ psycopg-3.3.8.dist-info/top_level.txt,sha256=npthKx2_OEoahttYqdsIPlRUgjS_bQBmfpDCVxQcPGo,8
7
7
  psycopg/__init__.py,sha256=XxYHoZPLY-YKDFaHIJ0r0OMCl2C5VZ6ZaPMda12Cx3g,3423
8
8
  psycopg/__pycache__/__init__.cpython-313.pyc,,
9
9
  psycopg/__pycache__/_acompat.cpython-313.pyc,,
@@ -76,7 +76,7 @@ psycopg/_copy.py,sha256=Y9N2jQuE_MK5M-nunJ7ZrR3GpLfOnUn_LRCyY34vcOI,9735
76
76
  psycopg/_copy_async.py,sha256=jL2_b3CgDqzv0WkWldtyoIe-AkGwocAPM18Xm1ArNK4,9974
77
77
  psycopg/_copy_base.py,sha256=u2mwZxLMrIWDDvWgO5nb_KEsb9LZSYE52PFd374FoNk,14312
78
78
  psycopg/_cursor_base.py,sha256=aqfhe1f-N_NDgJ6tReu6N2Rmav6_7hUX_pMKnqdBhuc,23103
79
- psycopg/_dns.py,sha256=y4dSF6yUtTTOYgYwFQyuJYcoUfBiXZSkGeaRqwdGRiU,7852
79
+ psycopg/_dns.py,sha256=vgo0PxPMUrXF26pIbz3HsA1RkWyvjZTvLVA89X36uww,8006
80
80
  psycopg/_encodings.py,sha256=wdONXpHrOA8n4CirFw-88j0FOvwte1PNCOjy94oOzJw,4599
81
81
  psycopg/_enums.py,sha256=5gCef_sYe9UdaE4n_RmDWeF4TfQOwQFeikjrkz9YivI,1691
82
82
  psycopg/_oids.py,sha256=mJI8HbRrTsbK0LIgnnG5xPH-3hxNUclotqUurmyo2s0,1875
@@ -98,7 +98,7 @@ psycopg/_typemod.py,sha256=25uahNc_1W1ASkgQ1Y0IhjZtyERVYlxrdEq7XcCDrtY,3165
98
98
  psycopg/_tz.py,sha256=_-W0Izs84UYrbAY3I1CicGUk0ng-boCMZo5H5h0j9ug,1186
99
99
  psycopg/_wrappers.py,sha256=wKZt_ar8QuRgEKC6tuwamYXCwB1P7IZQsmgYdVOlAhU,3126
100
100
  psycopg/abc.py,sha256=uvhJMFQm6E_gfJqUWbIq70AqOlKURY9GHzF4g2-1Djg,7770
101
- psycopg/adapt.py,sha256=fZV7nGpqV2UKwixLu50k1fb_sg0um6SuV1rCGVn136M,5195
101
+ psycopg/adapt.py,sha256=EIF0LegtdmwqWyVE1WnrBrTFnfugYCJ8fFfYKH9TCOY,5437
102
102
  psycopg/client_cursor.py,sha256=nRo3bckcKj3nZGAcXzrsPP45hEMfaxlegVne9wMdaz8,2681
103
103
  psycopg/connection.py,sha256=AJXL6CYrQ2RfVGEbgXIm7KtookJSodOK-9_cbXJXOrQ,20665
104
104
  psycopg/connection_async.py,sha256=vQrHXLJAQUAmXzGmMBkvy_XU9cxvBSkPwJb-eM0Yo3s,22963
@@ -114,7 +114,7 @@ psycopg/cursor.py,sha256=n-26XoMiYo34ONdJp_SKe5CCYBqztNVSzllMVIfxPg8,11116
114
114
  psycopg/cursor_async.py,sha256=hx7jKMWQUx9iRwMdXbCqYICwd4x2v-BmXuSBbuv5owA,11426
115
115
  psycopg/dbapi20.py,sha256=ZQwoxxMO4OHuuLZ06p19VWgJtmFbLX5YuLHbyjNF2YI,3309
116
116
  psycopg/errors.py,sha256=XrkWWippwHpMm49TQ4LBDsg-g_Y-V8GFTuLtlQ3Tmhc,46563
117
- psycopg/generators.py,sha256=GtvzoPElSNcIRM1Dach_LOxpBgViMH3LvJtv9etX9oE,12476
117
+ psycopg/generators.py,sha256=7JPG_mz-yXvKj1bvEE2ZhJ8ZyQqTPMq_hCajWX_jHW8,12462
118
118
  psycopg/postgres.py,sha256=g1IImgRkiMny5OreYHZmonkI_CVNjOFpUYAFmWvCoUM,6439
119
119
  psycopg/pq/__init__.py,sha256=bT8FsbWgKJb7Ck-2kMiugQko9FnDVdcEJuwb50SPUOU,3976
120
120
  psycopg/pq/__pycache__/__init__.cpython-313.pyc,,
@@ -135,7 +135,7 @@ psycopg/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
135
  psycopg/raw_cursor.py,sha256=tkdDWTEAKr9TdN5RcHhIPdAdYsngs5oZmmQt-2hQwmQ,1159
136
136
  psycopg/rows.py,sha256=M1wDxKWFF8KM9Qkejj3a_JdUhBjuv-uVmrYw4vBGW9s,7959
137
137
  psycopg/sql.py,sha256=zntTeNSnZ6pqBNYCy-mhsvXxerKp53Xt4M3glFNab-g,19116
138
- psycopg/transaction.py,sha256=-JzORVBhEFk_kwvG1REbztQ7EitwJmtrTrJ5u6AUyLQ,10060
138
+ psycopg/transaction.py,sha256=oB-rfQAIuswEdI5yihIUk2TeEhP97P988NLSxz_8tVg,10964
139
139
  psycopg/types/__init__.py,sha256=JPAkV4EfkXwdsr76_U1DsQV19c8aQNSB6kgud4bhXeM,181
140
140
  psycopg/types/__pycache__/__init__.cpython-313.pyc,,
141
141
  psycopg/types/__pycache__/array.cpython-313.pyc,,
@@ -154,13 +154,13 @@ psycopg/types/__pycache__/range.cpython-313.pyc,,
154
154
  psycopg/types/__pycache__/shapely.cpython-313.pyc,,
155
155
  psycopg/types/__pycache__/string.cpython-313.pyc,,
156
156
  psycopg/types/__pycache__/uuid.cpython-313.pyc,,
157
- psycopg/types/array.py,sha256=hE1aQzEutHYED6DiRHAhtZ2aYBFhKhHYn0J39NuhVkg,15230
157
+ psycopg/types/array.py,sha256=7Ju-GmmuKoE2laM2KVXMxasTooKQpW4yXwr1ZfEwqGU,16668
158
158
  psycopg/types/bool.py,sha256=0GJQG-Cm5P5NgH8TfLNj9n_e5ckw42XnsRBinX0k45w,1163
159
- psycopg/types/composite.py,sha256=MLqnvmEmfvaZnvtwuzOolL_DzDsgUiXeepVYOjfTpJY,18316
160
- psycopg/types/datetime.py,sha256=Ot-L24HGcqJfRbCCftLw_9BLsH4kPH9-mAVrI4h71iM,25476
159
+ psycopg/types/composite.py,sha256=vMWFEHtXnR3Cz_M7l5ahVh_ha4X7sXT58EgWubUhDUY,18516
160
+ psycopg/types/datetime.py,sha256=OYmd2o9635uxPrJ39Xz2wqdV-Gc52XSEMc7BgEQImgI,25585
161
161
  psycopg/types/enum.py,sha256=iIb1B3TMJxdbptqaRvzb92S5IU5SR0Y8dvVOkiwsouQ,7479
162
162
  psycopg/types/hstore.py,sha256=CtE4aq_Cc5bVzjQROH7NHV5DOxK89nXTVZolPmRrL7E,7076
163
- psycopg/types/json.py,sha256=qfzT5wPGadg2GrVg9qpHGHmKYAqXL4ytD19Zc-lnp9w,9712
163
+ psycopg/types/json.py,sha256=iJOgq6DRGu0geDbNSvxtPxnqsg_HuyXTdBI4XoWe-Y8,9713
164
164
  psycopg/types/multirange.py,sha256=ITuoEw72k4oM-3fv6mJ7Td3_3ynF2u_y219RbT_EhZo,17862
165
165
  psycopg/types/net.py,sha256=h1vJ8Fpo4ekJpMMiiNym16EMiUmyiFtahqsQZuaZRcM,6732
166
166
  psycopg/types/none.py,sha256=gy_OJqE1YslJ2RIix0Eq3x0B8IPfoH-Gcc2sQMIO0Sw,666
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (84.0.0)
2
+ Generator: setuptools (84.2.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: psycopg-binary
3
- Version: 3.3.6
3
+ Version: 3.3.8
4
4
  Summary: PostgreSQL database adapter for Python -- C optimisation distribution
5
5
  Author-email: Daniele Varrazzo <daniele.varrazzo@gmail.com>
6
6
  License-Expression: LGPL-3.0-only
@@ -0,0 +1,29 @@
1
+ psycopg_binary-3.3.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
+ psycopg_binary-3.3.8.dist-info/METADATA,sha256=JewZuw7e47KRajJ5RNNSLbVbdNmuVR7bkpxKyIa2UGQ,2709
3
+ psycopg_binary-3.3.8.dist-info/RECORD,,
4
+ psycopg_binary-3.3.8.dist-info/WHEEL,sha256=I7C6oPU9_YXUwpeWU-HCMP--1MGENZx31r2O4ozCW_U,136
5
+ psycopg_binary-3.3.8.dist-info/licenses/LICENSE.txt,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
6
+ psycopg_binary-3.3.8.dist-info/top_level.txt,sha256=8OM_PsAa5oKkzVvRu8kDESihBQo_LXqwG_nrlecubIk,15
7
+ psycopg_binary/.dylibs/libcom_err.3.0.dylib,sha256=TQaKOB1LKxUV2a9tGU6lMsmgJPvJ6cNuuAMOufsuaus,73456
8
+ psycopg_binary/.dylibs/libcrypto.3.dylib,sha256=KcYYYRU4fva_qnUI9udqWKLJzZxFeppT9xDc_F4zOE0,4975456
9
+ psycopg_binary/.dylibs/libgssapi_krb5.2.2.dylib,sha256=Dadi0NvEcrVv1TzEBoaPemxDLlkE1INHQoqBzBwEIrU,396400
10
+ psycopg_binary/.dylibs/libk5crypto.3.1.dylib,sha256=nAXUBqLpKpr-gs1rSLEtCWTPFy8B2rxtJphhV3AU2Zw,247632
11
+ psycopg_binary/.dylibs/libkrb5.3.3.dylib,sha256=GpHiLJmn_DeJQPWi_uxR52MSyLardNJFj3SUSQLu2GE,982192
12
+ psycopg_binary/.dylibs/libkrb5support.1.1.dylib,sha256=UL15bSoQT7u9fX6vqNm5LBfO69g8QGUTJaHvHYUF5Cw,110048
13
+ psycopg_binary/.dylibs/liblber.2.dylib,sha256=Bz5VFYayilE5nY2x_WKzMlTMYlfjQ19STHjSQ6SxiQM,138608
14
+ psycopg_binary/.dylibs/libldap.2.dylib,sha256=zctJ4UqxazX1ZAmSidhf1cJhF3ch-6Jp2wwOFYBm_OM,477936
15
+ psycopg_binary/.dylibs/libpq.5.dylib,sha256=HqjK9TrNVkZlybwSNCxlRUmygzAR6qxqp1lfwRsDTVE,371120
16
+ psycopg_binary/.dylibs/libssl.3.dylib,sha256=xshl2TsQsG-0D1HVttOigdz8ylSc5p3tQX36AcDbdX0,1032368
17
+ psycopg_binary/__init__.py,sha256=5kxw9Qdn8ubIi4ik92mxZOsjr5UO0vwq5T5S0BhCWGg,402
18
+ psycopg_binary/__pycache__/__init__.cpython-313.pyc,,
19
+ psycopg_binary/__pycache__/_uuid.cpython-313.pyc,,
20
+ psycopg_binary/__pycache__/version.cpython-313.pyc,,
21
+ psycopg_binary/_psycopg.c,sha256=OYgL9xJkSiOKBGE_hBNkqZk-Hj5Z9vmP6xMY2rxeJO0,5402190
22
+ psycopg_binary/_psycopg.cpython-313-darwin.so,sha256=4cVh1veHL53bb_ZRnLgl5x94md5dkodCebkEM3mTJK0,918352
23
+ psycopg_binary/_psycopg.pyi,sha256=4pCOJOcyGntXxhVmmoHT9L8mbBozbVJg0r5vKhtShXQ,3178
24
+ psycopg_binary/_uuid.py,sha256=YXxC9J0hcZFWvBY5YpJf_7WpstMmlQ21dKMgwGW91bU,798
25
+ psycopg_binary/pq.c,sha256=Q4qmcDEQIKSmg9XUsA-Zz3VvUO1l6NjQF0Xa9WbM_6U,2037302
26
+ psycopg_binary/pq.cpython-313-darwin.so,sha256=dP3s592BzF3OjqoGfzHcNHzuKzNvWhqMHi08q-3JSdQ,419584
27
+ psycopg_binary/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ psycopg_binary/types/numutils.c,sha256=KWSeNIn9Rt1YXh0b02s5QhE4XzTgAMGx-ZGx9AEtQ-I,6034
29
+ psycopg_binary/version.py,sha256=AchcLWfoay902mrP3j1Qy3nQ2F5QOzNIv8Yy0NdwFrc,246
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pydantic
3
- Version: 2.14.1
3
+ Version: 2.14.3
4
4
  Summary: Data validation using Python type hints
5
5
  Project-URL: Homepage, https://github.com/pydantic/pydantic
6
6
  Project-URL: Documentation, https://pydantic.dev/docs/validation/latest/get-started/
@@ -11,6 +11,7 @@ Author-email: Samuel Colvin <s@muelcolvin.com>, Eric Jolibois <em.jolibois@gmail
11
11
  License-Expression: MIT
12
12
  License-File: LICENSE
13
13
  Classifier: Development Status :: 5 - Production/Stable
14
+ Classifier: Environment :: WebAssembly :: Emscripten
14
15
  Classifier: Framework :: Hypothesis
15
16
  Classifier: Framework :: Pydantic
16
17
  Classifier: Intended Audience :: Developers
@@ -26,12 +27,13 @@ Classifier: Programming Language :: Python :: 3.13
26
27
  Classifier: Programming Language :: Python :: 3.14
27
28
  Classifier: Programming Language :: Python :: 3.15
28
29
  Classifier: Programming Language :: Python :: Implementation :: CPython
30
+ Classifier: Programming Language :: Python :: Implementation :: GraalPy
29
31
  Classifier: Programming Language :: Python :: Implementation :: PyPy
30
32
  Classifier: Topic :: Internet
31
33
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
32
34
  Requires-Python: >=3.10
33
35
  Requires-Dist: annotated-types>=0.6.0
34
- Requires-Dist: pydantic-core==2.50.1
36
+ Requires-Dist: pydantic-core==2.50.4
35
37
  Requires-Dist: typing-extensions>=4.16.0
36
38
  Requires-Dist: typing-inspection>=0.4.4
37
39
  Provides-Extra: email
@@ -117,6 +119,107 @@ See our [security policy](https://github.com/pydantic/pydantic/security/policy).
117
119
  <!-- markdownlint-disable descriptive-link-text -->
118
120
  <!-- markdownlint-disable-next-line first-line-heading -->
119
121
 
122
+ ## v2.14.3 (2026-11-04)
123
+
124
+ [GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.14.3)
125
+
126
+ ### What's Changed
127
+
128
+ #### Packaging
129
+
130
+ * Build wheels for GraalPy 3.13 by [@msimacek](https://github.com/msimacek) in [#14136](https://github.com/pydantic/pydantic/pull/14136).
131
+
132
+ The previous v2.14.2 release published GraalPy 3.11 wheels, which were not working due to a PyO3 version bump. A CI workflow issue
133
+ made it so that the wheel wasn't tested before publishing. This is now fixed: starting in v2.14.3, we no longer publish GraalPy 3.11
134
+ wheels, and GraalPy 3.13 wheels are now published together with the existing 3.12 one.
135
+
136
+ #### Performance
137
+
138
+ * Improve schema generation for fixed type handlers by [@alexmojaki](https://github.com/alexmojaki) in [#14130](https://github.com/pydantic/pydantic/pull/14130)
139
+ * Skip general schema dispatch for builtin scalars by [@alexmojaki](https://github.com/alexmojaki) in [#14141](https://github.com/pydantic/pydantic/pull/14141)
140
+ * Skip annotation handler setup when annotations are empty by [@alexmojaki](https://github.com/alexmojaki) in [#14149](https://github.com/pydantic/pydantic/pull/14149)
141
+ * Fix quadratic serialization time with per-index `include`/`exclude` on sequences by [@Viicos](https://github.com/Viicos) in [#14160](https://github.com/pydantic/pydantic/pull/14160)
142
+ * Avoid type lookups when checking for `None` during serialization by [@Viicos](https://github.com/Viicos) in [#14167](https://github.com/pydantic/pydantic/pull/14167)
143
+ * Improve performance of model serialization by [@Viicos](https://github.com/Viicos) in [#14171](https://github.com/pydantic/pydantic/pull/14171)
144
+ * Improve performance of dict serialization by [@Viicos](https://github.com/Viicos) in [#14172](https://github.com/pydantic/pydantic/pull/14172)
145
+ * Improve performance of type inference during serialization by [@Viicos](https://github.com/Viicos) in [#14173](https://github.com/pydantic/pydantic/pull/14173)
146
+ * Avoid cloning the field name when using the default value during validation by [@Viicos](https://github.com/Viicos) in [#14175](https://github.com/pydantic/pydantic/pull/14175)
147
+ * Do not evaluate `model_config` annotations by [@Viicos](https://github.com/Viicos) in [#14195](https://github.com/pydantic/pydantic/pull/14195)
148
+ * Avoid slow runtime `Protocol` check when expanding `GroupedMetadata` annotations by [@Viicos](https://github.com/Viicos) in [#14196](https://github.com/pydantic/pydantic/pull/14196)
149
+ * Use a lightweight `@contextmanager` implementation internally by [@Viicos](https://github.com/Viicos) in [#14199](https://github.com/pydantic/pydantic/pull/14199)
150
+
151
+ #### Fixes
152
+
153
+ * Fix various issues about GC tracking in `pydantic-core` by [@Viicos](https://github.com/Viicos) in [#13819](https://github.com/pydantic/pydantic/pull/13819)
154
+ * Include `null` in serialization JSON Schema for `unless-none` field serializers by [@Kropiunig](https://github.com/Kropiunig) in [#13848](https://github.com/pydantic/pydantic/pull/13848)
155
+ * Fix `RecursionError` when copying or unpickling models with `defer_build` by [@Viicos](https://github.com/Viicos) in [#14115](https://github.com/pydantic/pydantic/pull/14115)
156
+ * Remove dead `default_factory` check in unsupported `Field()` attribute by [@owtaylor](https://github.com/owtaylor) in [#14129](https://github.com/pydantic/pydantic/pull/14129)
157
+ * Disallow non string extra keys during validation by [@Viicos](https://github.com/Viicos) in [#14135](https://github.com/pydantic/pydantic/pull/14135)
158
+ * Fix deeply nested data being reported as a cyclic reference by [@Viicos](https://github.com/Viicos) in [#14164](https://github.com/pydantic/pydantic/pull/14164)
159
+
160
+ ### New Contributors
161
+
162
+ * [@owtaylor](https://github.com/owtaylor) made their first contribution in [#14129](https://github.com/pydantic/pydantic/pull/14129)
163
+
164
+ ## v2.14.2 (2026-10-29)
165
+
166
+ [GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.14.2)
167
+
168
+ ### What's Changed
169
+
170
+ #### Packaging
171
+
172
+ * Bump PyO3 to 0.30.1, jiter to 0.18.0, use `PyFrozenDict` by [@Viicos](https://github.com/Viicos) in [#14003](https://github.com/pydantic/pydantic/pull/14003)
173
+ * Bump speedate to v0.18.0 by [@Viicos](https://github.com/Viicos) in [#14007](https://github.com/pydantic/pydantic/pull/14007)
174
+ * Publish `pydantic-core` wheels for PyPy 8.0 (`pp80` ABI) by [@Viicos](https://github.com/Viicos) in [#14083](https://github.com/pydantic/pydantic/pull/14083)
175
+
176
+ #### Performance
177
+
178
+ * Avoid Python tuple allocation during model fields validation by [@Viicos](https://github.com/Viicos) in [#13955](https://github.com/pydantic/pydantic/pull/13955)
179
+ * Lazily call repr of values during nested union serialization by [@Viicos](https://github.com/Viicos) in [#14082](https://github.com/pydantic/pydantic/pull/14082)
180
+ * Skip decorator field checks when no field decorators exist by [@alexmojaki](https://github.com/alexmojaki) in [#14111](https://github.com/pydantic/pydantic/pull/14111)
181
+ * Avoid heap allocation for small JSON model field buffers by [@alexmojaki](https://github.com/alexmojaki) in [#14113](https://github.com/pydantic/pydantic/pull/14113)
182
+
183
+ #### Fixes
184
+
185
+ * Make JSON validation by iteration consistent with Python approach by [@davidhewitt](https://github.com/davidhewitt) in [#13275](https://github.com/pydantic/pydantic/pull/13275).
186
+
187
+ JSON validation now handles field lookup and extra data the same way as Python validation. In particular, keys that only match an
188
+ unused alias or field name are now treated as extra data, instead of being silently dropped:
189
+
190
+ ```python
191
+ from pydantic import BaseModel, ConfigDict
192
+ from pydantic.alias_generators import to_camel
193
+
194
+
195
+ class Page(BaseModel):
196
+ model_config = ConfigDict(extra='forbid', alias_generator=to_camel)
197
+
198
+ page_size: int = 10
199
+
200
+
201
+ Page.model_validate_json('{"page_size": 50}')
202
+ # Before: Page(page_size=10)
203
+ # After: ValidationError (extra_forbidden)
204
+ ```
205
+
206
+ See the [pull request](https://github.com/pydantic/pydantic/pull/13275) for the full list of behavior changes.
207
+
208
+ * Fix unpickling of generic classes defined in separate module by [@Viicos](https://github.com/Viicos) in [#13994](https://github.com/pydantic/pydantic/pull/13994)
209
+ * Support explicit `by_alias` overriding `validate_by_alias` in validation JSON schemas by [@Viicos](https://github.com/Viicos) in [#13997](https://github.com/pydantic/pydantic/pull/13997)
210
+ * Fix mypy plugin crash on deferred empty model by [@ilevkivskyi](https://github.com/ilevkivskyi) in [#14027](https://github.com/pydantic/pydantic/pull/14027)
211
+ * Fix infinite recursion when validating an invalid default with `PydanticUseDefault` by [@Viicos](https://github.com/Viicos) in [#14028](https://github.com/pydantic/pydantic/pull/14028)
212
+ * Implement recursion guard for `validate_strings()` by [@Viicos](https://github.com/Viicos) in [#14029](https://github.com/pydantic/pydantic/pull/14029)
213
+ * Support named tuples in `Sequence` serialization by [@Viicos](https://github.com/Viicos) in [#14033](https://github.com/pydantic/pydantic/pull/14033)
214
+ * Take `preserve_empty_path` into account in URL types equality by [@Viicos](https://github.com/Viicos) in [#14035](https://github.com/pydantic/pydantic/pull/14035)
215
+ * Fix pickling of `PydanticCustomError` and `ValidationError`s containing custom errors by [@Viicos](https://github.com/Viicos) in [#14051](https://github.com/pydantic/pydantic/pull/14051)
216
+ * Do not extract attribute docstrings from nested classes and functions by [@Viicos](https://github.com/Viicos) in [#14052](https://github.com/pydantic/pydantic/pull/14052)
217
+ * Fix forward annotations evaluation and type variables substitution when rebuilding parametrized generic models by [@Viicos](https://github.com/Viicos) in [#14054](https://github.com/pydantic/pydantic/pull/14054)
218
+ * Fix `Self` resolution in parametrized generics by [@Viicos](https://github.com/Viicos) in [#14065](https://github.com/pydantic/pydantic/pull/14065)
219
+ * Ignore extra data matching a field name in `TypedDict` and dataclasses with `extra=allow` by [@Viicos](https://github.com/Viicos) in [#14090](https://github.com/pydantic/pydantic/pull/14090)
220
+ * Check mapping `max_length` constraint during validation by [@Viicos](https://github.com/Viicos) in [#14092](https://github.com/pydantic/pydantic/pull/14092)
221
+ * Fix deep copy of self-referential models by [@Viicos](https://github.com/Viicos) in [#14116](https://github.com/pydantic/pydantic/pull/14116)
222
+
120
223
  ## v2.14.1 (2026-10-11)
121
224
 
122
225
  [GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.14.1)
@@ -1,8 +1,8 @@
1
- pydantic-2.14.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
- pydantic-2.14.1.dist-info/METADATA,sha256=TUyOjV5qJ9Ugjw15SfJWKOZ0cTMDSWnU0TmbGtU5QDY,133006
3
- pydantic-2.14.1.dist-info/RECORD,,
4
- pydantic-2.14.1.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
5
- pydantic-2.14.1.dist-info/licenses/LICENSE,sha256=qeGG88oWte74QxjnpwFyE1GgDLe4rjpDlLZ7SeNSnvM,1129
1
+ pydantic-2.14.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
+ pydantic-2.14.3.dist-info/METADATA,sha256=w-uJhBcr7cjgVmVeFBk1H0SXN0qRt7cJ28ShNA9Q4ek,141528
3
+ pydantic-2.14.3.dist-info/RECORD,,
4
+ pydantic-2.14.3.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
5
+ pydantic-2.14.3.dist-info/licenses/LICENSE,sha256=qeGG88oWte74QxjnpwFyE1GgDLe4rjpDlLZ7SeNSnvM,1129
6
6
  pydantic/__init__.py,sha256=5SSMubvik7NTbb7X_qVDJtzfPAM3CuXwPXlMWEluwBs,15951
7
7
  pydantic/__pycache__/__init__.cpython-313.pyc,,
8
8
  pydantic/__pycache__/_migration.cpython-313.pyc,,
@@ -42,6 +42,7 @@ pydantic/__pycache__/warnings.cpython-313.pyc,,
42
42
  pydantic/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  pydantic/_internal/__pycache__/__init__.cpython-313.pyc,,
44
44
  pydantic/_internal/__pycache__/_config.cpython-313.pyc,,
45
+ pydantic/_internal/__pycache__/_contextlib.cpython-313.pyc,,
45
46
  pydantic/_internal/__pycache__/_core_metadata.cpython-313.pyc,,
46
47
  pydantic/_internal/__pycache__/_core_utils.cpython-313.pyc,,
47
48
  pydantic/_internal/__pycache__/_dataclasses.cpython-313.pyc,,
@@ -69,31 +70,32 @@ pydantic/_internal/__pycache__/_typing_extra.cpython-313.pyc,,
69
70
  pydantic/_internal/__pycache__/_utils.cpython-313.pyc,,
70
71
  pydantic/_internal/__pycache__/_validate_call.cpython-313.pyc,,
71
72
  pydantic/_internal/__pycache__/_validators.cpython-313.pyc,,
72
- pydantic/_internal/_config.py,sha256=uxf8GUm6HzsBeJ_rYiCnUWxFYt8LtRZSt54uSHNePQA,14916
73
+ pydantic/_internal/_config.py,sha256=4rgEq34CVc6GIrTlMQ9cJ8S5BO88SqsDQo6m68TFbac,14918
74
+ pydantic/_internal/_contextlib.py,sha256=Ir65W0klj3HuNNOuvIe_oVzDmt6hknfVWV7cemr6F7Y,3596
73
75
  pydantic/_internal/_core_metadata.py,sha256=Y_g2t3i7uluK-wXCZvzJfRFMPUM23aBYLfae4FzBPy0,5162
74
76
  pydantic/_internal/_core_utils.py,sha256=iovsFQ0u9wtPvEXNSqQtXGSFXcpPE_aTAo1SXM75G1E,5913
75
- pydantic/_internal/_dataclasses.py,sha256=Oxv8s2EK-PQvYAe_9kD1yKg9cMNJtm1lg0SWtRyz2Ww,13640
77
+ pydantic/_internal/_dataclasses.py,sha256=yyHFG9d0QwEN_9MVrn8xRV-GMSXS51tfxn9tcJbeTtw,13642
76
78
  pydantic/_internal/_decorators.py,sha256=ZqaoKcwtWudWa-WsopixHSZeA75YGIkI9GOigCmIzlk,35483
77
79
  pydantic/_internal/_decorators_v1.py,sha256=v7_cyEBvJceFO0aYa1AuvYeaMvjEYRQ3-TbW8U8Ghds,6198
78
80
  pydantic/_internal/_discriminated_union.py,sha256=HdRL2XOFoCeV95rK0YkxJWPhSdmZWnutRaaBkmQ60Hs,27686
79
- pydantic/_internal/_docs_extraction.py,sha256=8UYnAy-GxCePc0XoH43oIkdNAqFmICLyjp48SMtGoCw,4140
80
- pydantic/_internal/_fields.py,sha256=-lSyiply9Ttnx51WhUnaxXvnZ0Yem_qZxh7vUSptqyo,39627
81
+ pydantic/_internal/_docs_extraction.py,sha256=V8_-TfG1oUHpEThCvNtZjJaPwd-zVodn4EqkAGv17hY,4708
82
+ pydantic/_internal/_fields.py,sha256=OlKgiqVO6ITTezu46rIDkGdf0gh3qnphx92RhrP4m28,41083
81
83
  pydantic/_internal/_forward_ref.py,sha256=q6SQhW8wo9vPZiuXJ661Vfg7PgoqeJBQTA3dpInXWlA,641
82
- pydantic/_internal/_generate_schema.py,sha256=dZNxARwclDkMeG2j_S16MS8FvDA9GdnNh6VCaiEiFrA,141797
83
- pydantic/_internal/_generics.py,sha256=4WpBm518c-ZHOiT3ft1hK9JNocIuZkxzjXs8d1bnafg,24574
84
+ pydantic/_internal/_generate_schema.py,sha256=nUiqd0TSJLu5D0LPRChOpR3RxaDxvlZm9OxA6TWsWOs,144949
85
+ pydantic/_internal/_generics.py,sha256=zhuan6vsUx0YkNJJsRpKTLmuNYTQd3uJmJg3cp4A9z0,24849
84
86
  pydantic/_internal/_git.py,sha256=IwPh3DPfa2Xq3rBuB9Nx8luR2A1i69QdeTfWWXIuCVg,809
85
87
  pydantic/_internal/_import_utils.py,sha256=TRhxD5OuY6CUosioBdBcJUs0om7IIONiZdYAV7zQ8jM,402
86
- pydantic/_internal/_known_annotated_metadata.py,sha256=KSObdJ3af4YRPEcLFR65XBizJF33h5Ypckeu9JAvKxQ,16863
87
- pydantic/_internal/_mock_val_ser.py,sha256=VqbsIOgenoQQiM-NsFMl9uY7itgJSuPNpXVKaY7A0pM,9432
88
+ pydantic/_internal/_known_annotated_metadata.py,sha256=0AX_Pcok173WfuKbVjKjPk4e5OXqj3t4xGbcmEpEQpM,17480
89
+ pydantic/_internal/_mock_val_ser.py,sha256=zWWC-EVqWqmXeomhy6u5hXhNbvvDv0D5859KmO-j_B0,9672
88
90
  pydantic/_internal/_model_construction.py,sha256=6fixeFIkVMJP8Es9e3NGZbILnjtu1Mm119X-WtAZzuM,36663
89
- pydantic/_internal/_namespace_utils.py,sha256=8_QlLr773kmPzIGCu8RjExBJhGwBn0RAjKMWglzav-s,13328
91
+ pydantic/_internal/_namespace_utils.py,sha256=4xZrUon01na0AtJ0nY2tLQN2kuDH8erphK-g5KW_vOI,13331
90
92
  pydantic/_internal/_repr.py,sha256=MNka4onC9u-tXJvV2rsz3JXsuxqlwKbKnd16-tgxriw,4981
91
93
  pydantic/_internal/_schema_gather.py,sha256=0qGbiz4pdcfvdMiH7JueJ10tQ8c750g1OkZ0xyP_20Q,1892
92
94
  pydantic/_internal/_schema_generation_shared.py,sha256=8nLsSaqgEebxeF26OwiPBt0ZVPipGqW1IV40agkRfxw,4869
93
- pydantic/_internal/_serializers.py,sha256=YIWvSmAR5fnbGSWCOQduWt1yB4ZQY42eAruc-enrb6c,1491
95
+ pydantic/_internal/_serializers.py,sha256=evOucDhMiIjaik5f4yMLdDP08ODB0l2pCir22HuQ-Ag,1786
94
96
  pydantic/_internal/_signature.py,sha256=64JyRJJ8Gf-JOfrZa2xTNUdGpd7RGqdNLYFXYOFuPZU,7143
95
97
  pydantic/_internal/_type_refs.py,sha256=nxJgVhwwxiSOcQbrc1e5La-Dpm5wU_4SSKJUBkp0hOU,4521
96
- pydantic/_internal/_typing_extra.py,sha256=5WgRV0MVsZqah9pW4o_Bbmsu73BEmELVhO7k23NUNwQ,20967
98
+ pydantic/_internal/_typing_extra.py,sha256=sKfK5Bu2HFjhPuc_eT3WwjX0982335D2S0cfbwSWulE,21227
97
99
  pydantic/_internal/_utils.py,sha256=I95ZNRhlU-m8V5pqBZSrP2sMINY-iw5abcPUURhaBng,15386
98
100
  pydantic/_internal/_validate_call.py,sha256=GvGnf2WTPBm8g6X9U3RyMvL5o9y5K846kdK5CQ_QPhk,5369
99
101
  pydantic/_internal/_validators.py,sha256=-Y9au4Rzog0CdMEeOHs77c998MTvgaEWfRNgxDL2c4k,20987
@@ -139,22 +141,22 @@ pydantic/functional_serializers.py,sha256=wcF7l3ZzY4rEXBG0IkU3KLGr5_NIEKS6-CFq14
139
141
  pydantic/functional_validators.py,sha256=ungjnjugPxAh7vPhU7Yp7k6zdPUfKZrtOFbRzN064fw,33225
140
142
  pydantic/generics.py,sha256=0ZqZ9O9annIj_3mGBRqps4htey3b5lV1-d2tUxPMMnA,144
141
143
  pydantic/json.py,sha256=ZH8RkI7h4Bz-zp8OdTAxbJUoVvcoU-jhMdRZ0B-k0xc,140
142
- pydantic/json_schema.py,sha256=rRB_vFJULXrsTMsIVahTyIsa0nJX8oMYLe_mhPzqbSA,142234
143
- pydantic/main.py,sha256=hDNfwFoRKig0r0oEj3HGp8RrkPRGi-5UHaNuQ4o4cZA,91376
144
- pydantic/mypy.py,sha256=8qaRSTchUYqUln0bg8zojiTEKrO17Sjw5LSyhQSuGRk,64439
144
+ pydantic/json_schema.py,sha256=OBO7HfftJNOEBS7gMar0vv0FEn44oazCu7x7w2Eq59c,144167
145
+ pydantic/main.py,sha256=oYoupv4Cq9EDXdVrNQBv0psMkCJ_cdd-RfoOUq7Vruc,91726
146
+ pydantic/mypy.py,sha256=qWTROdLlgp9sRNXTPd4F3nQke818LSWdr7r83_5lmv4,64611
145
147
  pydantic/networks.py,sha256=YIXsCaWUqE7FMwAO5ujYXClMLxI3KP6e2MdVwnP5X4s,44516
146
148
  pydantic/parse.py,sha256=wkd82dgtvWtD895U_I6E1htqMlGhBSYEV39cuBSeo3A,141
147
149
  pydantic/plugin/__init__.py,sha256=SrVX9XDbUKzt6BVNBRKXKmEqxecEREq6A4WoV_RMJhc,7263
148
150
  pydantic/plugin/__pycache__/__init__.cpython-313.pyc,,
149
151
  pydantic/plugin/__pycache__/_loader.cpython-313.pyc,,
150
152
  pydantic/plugin/__pycache__/_schema_validator.cpython-313.pyc,,
151
- pydantic/plugin/_loader.py,sha256=hAjgSljoIhGx3AVpIpuqw5SPttBNNeGBSTrqSMnNiJk,2213
153
+ pydantic/plugin/_loader.py,sha256=QutCqFPFRlsQWbsm5Nv_U6SZfF0UN8s2tfJeTTwUSUQ,2115
152
154
  pydantic/plugin/_schema_validator.py,sha256=__9f3t6adZxNgyzajuNda5siIvKWDDXssE6QD8hzXB4,5815
153
155
  pydantic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
154
- pydantic/root_model.py,sha256=DlZVc2b8wLEYQD6ZmmxPSPMLxI-EnqHspBKysXGZSy0,8703
156
+ pydantic/root_model.py,sha256=7enqbPZHFXk7DO-2H9wG9NxmIGeJcbHSewhKSLS8a4A,8777
155
157
  pydantic/schema.py,sha256=Vqqjvq_LnapVknebUd3Bp_J1p2gXZZnZRgL48bVEG7o,142
156
158
  pydantic/tools.py,sha256=iHQpd8SJ5DCTtPV5atAV06T89bjSaMFeZZ2LX9lasZY,141
157
- pydantic/type_adapter.py,sha256=woRrtEFtcoVTrfTyzQ_e2yoprISljsSQU6LzPVx8ZV4,36039
159
+ pydantic/type_adapter.py,sha256=HuIrYnURDsX0TS1L8A_AKxymlqg9MA-ODuaCp99v-kc,36569
158
160
  pydantic/types.py,sha256=5IFO7vOYHyaPf4VE2bRi9aUdH1CY-NgADjpYDfwIWQQ,110280
159
161
  pydantic/typing.py,sha256=P7feA35MwTcLsR1uL7db0S-oydBxobmXa55YDoBgajQ,138
160
162
  pydantic/utils.py,sha256=15nR2QpqTBFlQV4TNtTItMyTJx_fbyV-gPmIEY1Gooc,141
@@ -190,8 +192,8 @@ pydantic/v1/annotated_types.py,sha256=uk2NAAxqiNELKjiHhyhxKaIOh8F1lYW_LzrW3X7oZB
190
192
  pydantic/v1/class_validators.py,sha256=ULOaIUgYUDBsHL7EEVEarcM-UubKUggoN8hSbDonsFE,14672
191
193
  pydantic/v1/color.py,sha256=iZABLYp6OVoo2AFkP9Ipri_wSc6-Kklu8YuhSartd5g,16844
192
194
  pydantic/v1/config.py,sha256=a6P0Wer9x4cbwKW7Xv8poSUqM4WP-RLWwX6YMpYq9AA,6532
193
- pydantic/v1/dataclasses.py,sha256=784cqvInbwIPWr9usfpX3ch7z4t3J2tTK6N067_wk1o,18172
194
- pydantic/v1/datetime_parse.py,sha256=4Qy1kQpq3rNVZJeIHeSPDpuS2Bvhp1KPtzJG1xu-H00,7724
195
+ pydantic/v1/dataclasses.py,sha256=0Sfk-TNwm21SqiGhhpzs1DsXajhdWM6Eh5ZiSu4bjIA,18358
196
+ pydantic/v1/datetime_parse.py,sha256=exzh-Ul0IWR4FwRVpvE5aoTQ69DK6R-vNCtUakowBxs,7728
195
197
  pydantic/v1/decorator.py,sha256=zaaxxxoWPCm818D1bs0yhapRjXm32V8G0ZHWCdM1uXA,10339
196
198
  pydantic/v1/env_settings.py,sha256=A9VXwtRl02AY-jH0C0ouy5VNw3fi6F_pkzuHDjgAAOM,14105
197
199
  pydantic/v1/error_wrappers.py,sha256=6625Mfw9qkC2NwitB_JFAWe8B-Xv6zBU7rL9k28tfyo,5196
@@ -200,18 +202,18 @@ pydantic/v1/fields.py,sha256=MjiQ6Q5RkE-koXfmx8tYJbfe97_QeYtnpkQf8OTve_s,50646
200
202
  pydantic/v1/generics.py,sha256=YzyKTZN6x5Q1RGJ3WQ9jN-uwHJxL3W4qoZqwcZXqxWg,17829
201
203
  pydantic/v1/json.py,sha256=WQ5Hy_hIpfdR3YS8k6N2E6KMJzsdbBi_ldWOPJaV81M,3390
202
204
  pydantic/v1/main.py,sha256=vRB1TbpkzPN3P5ijJlc-cjNuO-HciNOpC4b8K3zZnfc,45697
203
- pydantic/v1/mypy.py,sha256=Cl8XRfCmIcVE3j5AEU52C8iDh8lcX__D3hz2jIWxMAs,38860
205
+ pydantic/v1/mypy.py,sha256=egR4NqF3clfaVYPP5nmj36jjdOHJpRPeGYS83mzNTJY,38898
204
206
  pydantic/v1/networks.py,sha256=HYNtKAfOmOnKJpsDg1g6SIkj9WPhU_-i8l5e2JKBpG4,22124
205
207
  pydantic/v1/parse.py,sha256=BJtdqiZRtav9VRFCmOxoY-KImQmjPy-A_NoojiFUZxY,1821
206
208
  pydantic/v1/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
207
209
  pydantic/v1/schema.py,sha256=aqBuA--cq8gAVkim5BJPFASHzOZ8dFtmFX_fNGr6ip4,47801
208
210
  pydantic/v1/tools.py,sha256=1lDdXHk0jL5uP3u5RCYAvUAlGClgAO-45lkq9j7fyBA,2881
209
- pydantic/v1/types.py,sha256=Bzl-RcnitPBHnqwwj9iv7JjHuN1GpnWH24dKkF3l9e8,35455
211
+ pydantic/v1/types.py,sha256=RfJ19cNFhy-VKs2lzIIl9_dHYn8Vlabd7VktOvoQawI,35793
210
212
  pydantic/v1/typing.py,sha256=ovwtLpEZCbnghZaHfSNJupzetzHNkLXjn_66kgTnIV4,20102
211
213
  pydantic/v1/utils.py,sha256=1PqOIlz6OVWwGds3HBKlw4Et6asFou0UUpAto7jFOCs,26014
212
214
  pydantic/v1/validators.py,sha256=lyUkn1MWhHxlCX5ZfEgFj_CAHojoiPcaQeMdEM9XviU,22187
213
- pydantic/v1/version.py,sha256=YpHWOQKtGoxfyikzGrcmXJVKUVYB9EBdoCR994QxSnE,1039
215
+ pydantic/v1/version.py,sha256=51ZPNC7FcsbAGRl-p2_vbJ0-bKUtjtwc6hiKrBoG4ZA,1039
214
216
  pydantic/validate_call_decorator.py,sha256=oktZNbH04RAEV99NSvl5ETPNLTEEE_HLkwj64TOsWd0,4749
215
217
  pydantic/validators.py,sha256=pwbIJXVb1CV2mAE4w_EGfNj7DwzsKaWw_tTL6cviTus,146
216
- pydantic/version.py,sha256=9afD-VnYJ0CS7G0FdXKCEWW5IPY-ZHRsbU-ETDyysiA,3985
218
+ pydantic/version.py,sha256=_-GyAanvFkY9PQE6b8wWbrEmw2tlg1842flVvGv2kps,3985
217
219
  pydantic/warnings.py,sha256=tIhE-YCNiWNgO53dwo7jYdOFv7AHzJmTkbMdEGZLEko,5177
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.32.4
2
+ Generator: hatchling 1.33.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dbspec"
7
- version = "1.6.2"
7
+ version = "1.6.4"
8
8
  description = "DBSpec: CLI/TUI for database design (Excel as DSL)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -17,6 +17,7 @@ dependencies = [
17
17
  "alembic",
18
18
  "psycopg[binary]",
19
19
  "jinja2",
20
+ "tomlkit>=0.13.2",
20
21
  ]
21
22
 
22
23
  [project.scripts]
@@ -7,11 +7,12 @@ from collections.abc import Iterator as _DBSpecIterator
7
7
 
8
8
  _dbspec_NEXTVAL_RE = _dbspec_re.compile(
9
9
  r"\bnextval\s*\(\s*'((?:[^']|'')+)'\s*(?:::\s*(?:pg_catalog\.)?regclass)?\s*\)",
10
- _dbspec_re.IGNORECASE,
10
+ _dbspec_re.IGNORECASE | _dbspec_re.ASCII,
11
11
  )
12
12
  _dbspec_SEQUENCE_IDENTIFIER_RE = _dbspec_re.compile(r'"((?:[^"]|"")+)"|([^\W\d][\w$]*)')
13
13
  _dbspec_DOLLAR_QUOTE_RE = _dbspec_re.compile(r"\$(?:[^\W\d]\w*)?\$")
14
14
  _dbspec_INVALID_SEQUENCE_IDENTIFIER = "Invalid nextval sequence identifier"
15
+ _dbspec_SQL_WHITESPACE = " \t\n\r\f\v"
15
16
 
16
17
 
17
18
  def _dbspec_sequence_identity(value: str) -> tuple[str, ...]:
@@ -19,7 +20,7 @@ def _dbspec_sequence_identity(value: str) -> tuple[str, ...]:
19
20
  parts: list[str] = []
20
21
  end = 0
21
22
  for match in _dbspec_SEQUENCE_IDENTIFIER_RE.finditer(value):
22
- separator = value[end : match.start()].strip()
23
+ separator = value[end : match.start()].strip(_dbspec_SQL_WHITESPACE)
23
24
  if separator != ("." if parts else ""):
24
25
  raise ValueError(f"{_dbspec_INVALID_SEQUENCE_IDENTIFIER}: {value!r}")
25
26
  quoted, unquoted = match.groups()
@@ -29,7 +30,7 @@ def _dbspec_sequence_identity(value: str) -> tuple[str, ...]:
29
30
  else "".join(char.lower() if char.isascii() else char for char in unquoted)
30
31
  )
31
32
  end = match.end()
32
- if value[end:].strip() or len(parts) not in (1, 2):
33
+ if value[end:].strip(_dbspec_SQL_WHITESPACE) or len(parts) not in (1, 2):
33
34
  raise ValueError(f"{_dbspec_INVALID_SEQUENCE_IDENTIFIER}: {value!r}")
34
35
  return tuple(parts)
35
36
 
@@ -85,11 +86,7 @@ def _dbspec_executed_nextval_arguments(sql: str) -> _DBSpecIterator[str]:
85
86
  position += 1
86
87
 
87
88
 
88
- _dbspec_CAST_RE = _dbspec_re.compile(
89
- r"::\s*(?:pg_catalog\.)?[a-z_][\w. ]*(?:\(\s*\d+\s*\))?$", _dbspec_re.I
90
- )
91
89
  _dbspec_INTEGER_RE = _dbspec_re.compile(r"[+-]?\d+")
92
- _dbspec_WHITESPACE_RE = _dbspec_re.compile(r"\s+")
93
90
 
94
91
 
95
92
  def dbspec_compare_server_default(
@@ -126,21 +123,21 @@ def _dbspec_normalize_default(
126
123
  ) -> tuple[str, tuple[str, ...] | str] | None:
127
124
  if value is None:
128
125
  return None
129
- text = str(value).strip()
126
+ text = str(value).strip(_dbspec_SQL_WHITESPACE)
130
127
  if not text:
131
128
  return None
132
129
  sequence = _dbspec_normalize_nextval(text, column)
133
130
  if sequence is not None:
134
131
  return ("nextval", sequence)
135
- return ("literal", _dbspec_normalize_literal_default(text))
132
+ return ("literal", _dbspec_normalize_literal_default(text, column))
136
133
 
137
134
 
138
135
  def _dbspec_normalize_nextval(value: str, column: _DBSpecAny) -> tuple[str, ...] | None:
139
136
  try:
140
- arguments = list(_dbspec_executed_nextval_arguments(value))
141
- if not arguments:
137
+ match = _dbspec_NEXTVAL_RE.fullmatch(_dbspec_strip_balanced_parentheses(value))
138
+ if match is None:
142
139
  return None
143
- identity = _dbspec_sequence_identity(arguments[0].replace("''", "'"))
140
+ identity = _dbspec_sequence_identity(match[1].replace("''", "'"))
144
141
  except ValueError:
145
142
  return None
146
143
  if len(identity) == 1:
@@ -156,58 +153,143 @@ def _dbspec_column_schema(column: _DBSpecAny) -> str | None:
156
153
  return schema if isinstance(schema, str) and schema else None
157
154
 
158
155
 
159
- def _dbspec_normalize_literal_default(value: str) -> str:
160
- text = value.strip()
161
- lowered = text.lower()
162
- if lowered.startswith("default "):
163
- text = text[8:].strip()
164
- text = _dbspec_strip_balanced_parentheses(text)
165
- text = _dbspec_CAST_RE.sub("", text).strip()
166
- text = _dbspec_strip_balanced_parentheses(text)
167
- lowered = text.lower()
168
- if lowered in {"true", "'true'", "1"}:
169
- return "true"
170
- if lowered in {"false", "'false'", "0"}:
171
- return "false"
172
- if _dbspec_INTEGER_RE.fullmatch(text):
173
- return str(int(text))
174
- return _dbspec_WHITESPACE_RE.sub(" ", lowered)
156
+ def _dbspec_sql_tokens(value: str) -> list[str]:
157
+ """Tokenize enough PostgreSQL syntax to preserve literals and grouping."""
158
+ tokens: list[str] = []
159
+ position = 0
160
+ whitespace = ""
161
+ while position < len(value):
162
+ if value[position] in _dbspec_SQL_WHITESPACE:
163
+ whitespace += value[position]
164
+ position += 1
165
+ continue
166
+ start = position
167
+ if value.startswith("--", position):
168
+ end = value.find("\n", position)
169
+ position = len(value) if end < 0 else end + 1
170
+ elif value.startswith("/*", position):
171
+ depth = 1
172
+ position += 2
173
+ while position < len(value) and depth:
174
+ if value.startswith("/*", position):
175
+ depth += 1
176
+ position += 2
177
+ elif value.startswith("*/", position):
178
+ depth -= 1
179
+ position += 2
180
+ else:
181
+ position += 1
182
+ elif match := _dbspec_DOLLAR_QUOTE_RE.match(value, position):
183
+ end = value.find(match[0], match.end())
184
+ position = len(value) if end < 0 else end + len(match[0])
185
+ elif value[position] in ("'", '"') or (
186
+ value[position] in "eEbBxXnN" and value[position + 1:position + 2] == "'"
187
+ ) or (
188
+ value[position] in "uU" and value[position + 1:position + 2] == "&"
189
+ and value[position + 2:position + 3] in ("'", '"')
190
+ ):
191
+ escaped = value[position] in "eE"
192
+ if value[position] in "uU":
193
+ position += 2
194
+ elif value[position] in "eEbBxXnN":
195
+ position += 1
196
+ quote = value[position]
197
+ position += 1
198
+ while position < len(value):
199
+ if value.startswith(quote * 2, position):
200
+ position += 2
201
+ elif escaped and value[position] == "\\":
202
+ position += 2
203
+ elif value[position] == quote:
204
+ position += 1
205
+ break
206
+ else:
207
+ position += 1
208
+ else:
209
+ match = _dbspec_re.match(
210
+ r"(?:[A-Za-z_]|[^\x00-\x7f])(?:[A-Za-z_0-9$]|[^\x00-\x7f])*|[0-9]+(?:\.[0-9]+)?|[+*/<>=~!@#%^&|`?:-]+|.",
211
+ value[position:],
212
+ )
213
+ assert match is not None
214
+ position += len(match[0])
215
+ token = value[start:position]
216
+ # Adjacent string literals separated by a newline concatenate in PostgreSQL.
217
+ if whitespace and tokens and tokens[-1].endswith("'") and token.startswith("'"):
218
+ tokens.append("\n" if "\n" in whitespace else " ")
219
+ whitespace = ""
220
+ opaque = token.startswith(("'", '"', "$", "--", "/*")) or (
221
+ len(token) >= 2 and token[0] in "eEbBxXnN" and token[1] == "'"
222
+ ) or (len(token) >= 3 and token[0] in "uU" and token[1] == "&" and token[2] in ("'", '"'))
223
+ folded = "".join(char.lower() if char.isascii() else char for char in token)
224
+ tokens.append(token if opaque else folded)
225
+ return tokens
175
226
 
176
227
 
177
228
  def _dbspec_strip_balanced_parentheses(value: str) -> str:
178
- text = value.strip()
179
- while (
180
- text.startswith("(")
181
- and text.endswith(")")
182
- and _dbspec_has_wrapping_parentheses(text)
183
- ):
184
- text = text[1:-1].strip()
185
- return text
229
+ tokens = _dbspec_sql_tokens(value)
230
+ while len(tokens) >= 2 and tokens[0] == "(" and tokens[-1] == ")":
231
+ depth = 0
232
+ for position, token in enumerate(tokens):
233
+ if token == "(":
234
+ depth += 1
235
+ elif token == ")":
236
+ depth -= 1
237
+ if depth <= 0 and position != len(tokens) - 1:
238
+ return " ".join(tokens)
239
+ if depth != 0:
240
+ break
241
+ tokens = tokens[1:-1]
242
+ return " ".join(tokens)
186
243
 
187
244
 
188
- def _dbspec_has_wrapping_parentheses(value: str) -> bool:
189
- depth = 0
190
- quote: str | None = None
191
- index = 0
192
- while index < len(value):
193
- char = value[index]
194
- if quote is not None:
195
- if char == quote:
196
- if index + 1 < len(value) and value[index + 1] == quote:
197
- index += 2
198
- continue
199
- quote = None
200
- index += 1
201
- continue
202
- if char in {"'", '"'}:
203
- quote = char
204
- elif char == "(":
205
- depth += 1
206
- elif char == ")":
207
- depth -= 1
208
- if depth == 0 and index != len(value) - 1:
209
- return False
210
- if depth < 0:
211
- return False
212
- index += 1
213
- return depth == 0
245
+ def _dbspec_normalize_sql_expression(value: str) -> str:
246
+ return _dbspec_strip_balanced_parentheses(value)
247
+
248
+
249
+ def _dbspec_string_literal(value: str) -> str | None:
250
+ match = _dbspec_re.fullmatch(
251
+ r"'((?:[^']|'')*)'(?:\s*::\s*(?:pg_catalog\s*\.\s*)?(?:text|varchar|character\s+varying))?",
252
+ value, _dbspec_re.IGNORECASE | _dbspec_re.ASCII,
253
+ )
254
+ return match[1].replace("''", "'") if match else None
255
+
256
+
257
+ def _dbspec_normalize_literal_default(value: str, column: _DBSpecAny = None) -> str:
258
+ text = value.strip(_dbspec_SQL_WHITESPACE)
259
+ if text.lower().startswith("default "):
260
+ text = text[8:].strip(_dbspec_SQL_WHITESPACE)
261
+ text = _dbspec_strip_balanced_parentheses(text)
262
+ column_type = str(getattr(column, "type", "")).lower()
263
+ if _dbspec_re.fullmatch(r"(?:varchar|character varying|text)(?:\(\d+\))?", column_type):
264
+ literal = _dbspec_string_literal(text)
265
+ if literal is not None:
266
+ return "string:" + literal
267
+ return "sql:" + text
268
+ # Only normalize primitive casts; expressions and domain casts stay visible.
269
+ cast = _dbspec_re.fullmatch(
270
+ r"(.+?)\s*::\s*(?:pg_catalog\s*\.\s*)?(boolean|bool|integer|int|int4|bigint|int8|smallint|int2)",
271
+ text, _dbspec_re.IGNORECASE | _dbspec_re.ASCII,
272
+ )
273
+ primitive_text = _dbspec_strip_balanced_parentheses(cast[1]) if cast else text
274
+ cast_type = cast[2].lower() if cast else ""
275
+ boolean_casts = {"boolean", "bool"}
276
+ if cast_type in boolean_casts:
277
+ boolean = _dbspec_re.fullmatch(r"(?:'(true|false)'|(true|false))", primitive_text, _dbspec_re.IGNORECASE | _dbspec_re.ASCII)
278
+ if boolean:
279
+ return (boolean[1] or boolean[2]).lower()
280
+ return text
281
+ if cast:
282
+ # Quoted numeric literals are safe only with an explicit integer cast.
283
+ quoted = _dbspec_re.fullmatch(r"'([+-]?[0-9]+)'", primitive_text)
284
+ if quoted:
285
+ primitive_text = quoted[1]
286
+ integer = _dbspec_re.fullmatch(r"([+-]?)[ \t\n\r\f\v]*([0-9]+)", primitive_text)
287
+ if integer:
288
+ number = int(integer[1] + integer[2])
289
+ bit_width = {"smallint": 16, "int2": 16, "integer": 32, "int": 32, "int4": 32, "bigint": 64, "int8": 64}.get(cast_type)
290
+ if bit_width is not None and not -(2 ** (bit_width - 1)) <= number < 2 ** (bit_width - 1):
291
+ return text
292
+ return str(number)
293
+ if not cast and primitive_text.lower() in {"true", "false"}:
294
+ return primitive_text.lower()
295
+ return text
package/bin/dbspec/dbspec CHANGED
Binary file
package/package.json CHANGED
@@ -24,5 +24,5 @@
24
24
  "publishConfig": {
25
25
  "access": "public"
26
26
  },
27
- "version": "1.6.2"
27
+ "version": "1.6.4"
28
28
  }
@@ -1,29 +0,0 @@
1
- psycopg_binary-3.3.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
- psycopg_binary-3.3.6.dist-info/METADATA,sha256=Ch-1KcHifKQWVUE-ZpyWS9DXBp6MwqsysZL8mLrzf9U,2709
3
- psycopg_binary-3.3.6.dist-info/RECORD,,
4
- psycopg_binary-3.3.6.dist-info/WHEEL,sha256=I7C6oPU9_YXUwpeWU-HCMP--1MGENZx31r2O4ozCW_U,136
5
- psycopg_binary-3.3.6.dist-info/licenses/LICENSE.txt,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
6
- psycopg_binary-3.3.6.dist-info/top_level.txt,sha256=8OM_PsAa5oKkzVvRu8kDESihBQo_LXqwG_nrlecubIk,15
7
- psycopg_binary/.dylibs/libcom_err.3.0.dylib,sha256=tFqQf72U0aNg_sXUjO2vVfx82_y2GlCs4zqOslXxbL0,73456
8
- psycopg_binary/.dylibs/libcrypto.3.dylib,sha256=qAQoOXlJOcTspvdMHGI6m_uiymDczVZxpfSgHEpe-xc,4975456
9
- psycopg_binary/.dylibs/libgssapi_krb5.2.2.dylib,sha256=hJkn_TaxOYsYMFyeT-d72Ru0mSZzolzuNhRR0wHsikk,396400
10
- psycopg_binary/.dylibs/libk5crypto.3.1.dylib,sha256=X7BMUdeYBwQM5YzttcGmwjKoblEHkf6vxECZHPaks_I,247632
11
- psycopg_binary/.dylibs/libkrb5.3.3.dylib,sha256=UMNJ6iViFHPffzaN3xZILo4TcTQK_QPQLVWDFPPQqSU,982192
12
- psycopg_binary/.dylibs/libkrb5support.1.1.dylib,sha256=I8HNLI-k7A79xwLZYcb7l5tre0_vS-WHsBAZbjAKGJQ,110048
13
- psycopg_binary/.dylibs/liblber.2.dylib,sha256=ZFTIKYq_KhLjXO5FmvkBHXNmqWBILQEmWfMVhlTYGDY,138608
14
- psycopg_binary/.dylibs/libldap.2.dylib,sha256=D8YA_1kthTm5P4chXzIgNTpF5wsp9xnxsj9733JsvFk,477936
15
- psycopg_binary/.dylibs/libpq.5.dylib,sha256=HqjK9TrNVkZlybwSNCxlRUmygzAR6qxqp1lfwRsDTVE,371120
16
- psycopg_binary/.dylibs/libssl.3.dylib,sha256=xshl2TsQsG-0D1HVttOigdz8ylSc5p3tQX36AcDbdX0,1032368
17
- psycopg_binary/__init__.py,sha256=5kxw9Qdn8ubIi4ik92mxZOsjr5UO0vwq5T5S0BhCWGg,402
18
- psycopg_binary/__pycache__/__init__.cpython-313.pyc,,
19
- psycopg_binary/__pycache__/_uuid.cpython-313.pyc,,
20
- psycopg_binary/__pycache__/version.cpython-313.pyc,,
21
- psycopg_binary/_psycopg.c,sha256=qzQcxFqYy0FursjeZo_OLNKV8Jmfx5bh3S2yed7d7Z0,5376870
22
- psycopg_binary/_psycopg.cpython-313-darwin.so,sha256=cuOUJm4WcepKK4cstzMstMmrnT8_P7yAJcludc7-JZk,918112
23
- psycopg_binary/_psycopg.pyi,sha256=4pCOJOcyGntXxhVmmoHT9L8mbBozbVJg0r5vKhtShXQ,3178
24
- psycopg_binary/_uuid.py,sha256=YXxC9J0hcZFWvBY5YpJf_7WpstMmlQ21dKMgwGW91bU,798
25
- psycopg_binary/pq.c,sha256=HFR_eUnR-YlXzHU-2lAxL642FsNjSAGZRzfqCFzvQvs,2035943
26
- psycopg_binary/pq.cpython-313-darwin.so,sha256=wfCupe87e_D6TqVaLGtm1L8SqZwLLTswoVk6baJXUC8,419584
27
- psycopg_binary/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- psycopg_binary/types/numutils.c,sha256=KWSeNIn9Rt1YXh0b02s5QhE4XzTgAMGx-ZGx9AEtQ-I,6034
29
- psycopg_binary/version.py,sha256=AchcLWfoay902mrP3j1Qy3nQ2F5QOzNIv8Yy0NdwFrc,246