pgdevkit 0.3.2__tar.gz → 0.3.3__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 (106) hide show
  1. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/PKG-INFO +2 -2
  2. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/schema.py +19 -1
  3. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pyproject.toml +1 -1
  4. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/uv.lock +1 -1
  5. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/.github/workflows/python-publish.yml +0 -0
  6. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/.github/workflows/python-test.yml +0 -0
  7. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/.gitignore +0 -0
  8. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/.python-version +0 -0
  9. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/README.md +0 -0
  10. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/docs/database-layout.md +0 -0
  11. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/__init__.py +0 -0
  12. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/backends/__init__.py +0 -0
  13. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/backends/base.py +0 -0
  14. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/backends/mssql.py +0 -0
  15. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/backends/postgres.py +0 -0
  16. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/cli.py +0 -0
  17. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/connection.py +0 -0
  18. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/db/__init__.py +0 -0
  19. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/db/complex_types.py +0 -0
  20. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/db/connection.py +0 -0
  21. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/db/crud.py +0 -0
  22. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/db/loader.py +0 -0
  23. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/db/model.py +0 -0
  24. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/db/mssql_crud.py +0 -0
  25. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/db/mssql_sql.py +0 -0
  26. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/dialect.py +0 -0
  27. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/diff.py +0 -0
  28. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/fetch_missing.py +0 -0
  29. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/introspect.py +0 -0
  30. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/lakebase.py +0 -0
  31. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/models.py +0 -0
  32. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/mssql_introspect.py +0 -0
  33. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/parser.py +0 -0
  34. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/__init__.py +0 -0
  35. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/_docker.py +0 -0
  36. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/api.py +0 -0
  37. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/config.py +0 -0
  38. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/constants.py +0 -0
  39. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/container.py +0 -0
  40. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/mssql/__init__.py +0 -0
  41. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/mssql/api.py +0 -0
  42. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/mssql/constants.py +0 -0
  43. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/mssql/container.py +0 -0
  44. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/naming.py +0 -0
  45. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/pgdevkit/testdb/query.py +0 -0
  46. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/skills/pgdevkit/SKILL.md +0 -0
  47. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/skills/pgdevkit/references/dynamic-sql.md +0 -0
  48. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/skills/pgdevkit/references/temporal-tables.md +0 -0
  49. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/__init__.py +0 -0
  50. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/conftest.py +0 -0
  51. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/db/__init__.py +0 -0
  52. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/db/test_complex_types.py +0 -0
  53. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/db/test_connection.py +0 -0
  54. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/db/test_crud.py +0 -0
  55. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/db/test_loader.py +0 -0
  56. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/db/test_mssql_crud_live.py +0 -0
  57. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/db/test_mssql_crud_sql.py +0 -0
  58. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/fixtures/01_schema.sql +0 -0
  59. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/fixtures/02_types.sql +0 -0
  60. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/fixtures/03_tables.sql +0 -0
  61. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/fixtures/04_views.sql +0 -0
  62. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/fixtures/05_functions.sql +0 -0
  63. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/fixtures/06_indexes.sql +0 -0
  64. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_cli_compare.py +0 -0
  65. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_compare.py +0 -0
  66. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_compare_mssql_live.py +0 -0
  67. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_connection.py +0 -0
  68. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_dialect.py +0 -0
  69. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_diff_mssql.py +0 -0
  70. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_fetch_missing.py +0 -0
  71. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_fetch_missing_cli.py +0 -0
  72. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_lakebase.py +0 -0
  73. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_mssql_introspect.py +0 -0
  74. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/test_parser_mssql.py +0 -0
  75. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/__init__.py +0 -0
  76. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/conftest.py +0 -0
  77. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/migrations/001_add_gadget_note.sql +0 -0
  78. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/tables/gadget.sql +0 -0
  79. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/tables/gadget.test_data.json +0 -0
  80. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/tables/widget.sql +0 -0
  81. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/tables/widget.test_data.json +0 -0
  82. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/tables/widget_part.sql +0 -0
  83. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/tables/widget_part_detail.sql +0 -0
  84. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/types/dimensions.sql +0 -0
  85. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/types/mood.sql +0 -0
  86. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/views/a_wrapper_view.sql +0 -0
  87. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/app/views/b_base_view.sql +0 -0
  88. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database/schema/app.sql +0 -0
  89. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database_mssql/app/tables/widget.sql +0 -0
  90. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database_mssql/app/tables/widget.test_data.json +0 -0
  91. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database_mssql/app/views/a_wrapper_view.sql +0 -0
  92. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database_mssql/app/views/b_base_view.sql +0 -0
  93. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/fixtures/database_mssql/schema/app.sql +0 -0
  94. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_api.py +0 -0
  95. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_api_mssql.py +0 -0
  96. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_api_mssql_live.py +0 -0
  97. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_cli.py +0 -0
  98. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_config.py +0 -0
  99. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_config_mssql.py +0 -0
  100. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_constants.py +0 -0
  101. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_container.py +0 -0
  102. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_mssql_constants.py +0 -0
  103. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_naming.py +0 -0
  104. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_query.py +0 -0
  105. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_schema.py +0 -0
  106. {pgdevkit-0.3.2 → pgdevkit-0.3.3}/tests/testdb/test_schema_mssql.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: pgdevkit
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: A helper for developing with Postgres
5
5
  Requires-Python: >=3.14
6
6
  Requires-Dist: docker>=7.1.0
@@ -195,6 +195,25 @@ async def _insert_test_data(
195
195
  # Silently drop JSON keys that don't correspond to a real column —
196
196
  # e.g. a stale fixture left over from a since-renamed/removed column.
197
197
  col_names = [c for c in rows[0] if c in complex_types]
198
+ has_complex_col = any(complex_types.get(col) is not None for col in col_names)
199
+
200
+ await cur.execute(SQL("DELETE FROM {t}").format(t=Identifier(schema, table_name)))
201
+
202
+ if not has_complex_col:
203
+ # No composite/enum/JSONB column on this table -- every value is a
204
+ # plain scalar or a native Postgres array, so COPY can take the
205
+ # rows as-is. COPY sends the whole batch as one stream instead of
206
+ # a parse/bind/execute round trip per row, which matters a lot for
207
+ # fixtures with tens of thousands of rows.
208
+ copy_sql = SQL("COPY {t} ({cols}) FROM STDIN").format(
209
+ t=Identifier(schema, table_name),
210
+ cols=SQL(", ").join(Identifier(c) for c in col_names),
211
+ )
212
+ async with cur.copy(copy_sql) as copy:
213
+ for row in rows:
214
+ await copy.write_row(tuple(row[c] for c in col_names))
215
+ return
216
+
198
217
  for row in rows:
199
218
  for col in col_names:
200
219
  info = complex_types.get(col)
@@ -206,7 +225,6 @@ async def _insert_test_data(
206
225
  # is left untouched.
207
226
  row[col] = await complex_helper.recursive_convert(row[col], info, con)
208
227
 
209
- await cur.execute(SQL("DELETE FROM {t}").format(t=Identifier(schema, table_name)))
210
228
  insert_sql = SQL("INSERT INTO {t} ({cols}) VALUES ({vals})").format(
211
229
  t=Identifier(schema, table_name),
212
230
  cols=SQL(", ").join(Identifier(c) for c in col_names),
@@ -11,7 +11,7 @@ packages = ["pgdevkit"]
11
11
 
12
12
  [project]
13
13
  name = "pgdevkit"
14
- version = "0.3.2"
14
+ version = "0.3.3"
15
15
  description = "A helper for developing with Postgres"
16
16
  readme = "README.md"
17
17
  requires-python = ">=3.14"
@@ -313,7 +313,7 @@ wheels = [
313
313
 
314
314
  [[package]]
315
315
  name = "pgdevkit"
316
- version = "0.3.2"
316
+ version = "0.3.3"
317
317
  source = { editable = "." }
318
318
  dependencies = [
319
319
  { name = "docker" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes