pgbelt 0.8.2__py3-none-any.whl → 0.9.2__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.
pgbelt/cmd/preflight.py CHANGED
@@ -12,44 +12,47 @@ from typer import echo
12
12
  from typer import style
13
13
 
14
14
 
15
- def _summary_table(results: dict, compared_extensions: list[str] = None) -> list[list]:
15
+ def _summary_table(
16
+ results: list[dict], compared_results: list[dict] | None = None
17
+ ) -> list[list]:
16
18
  """
17
19
  Takes a dict of precheck results for all databases and returns a summary table for echo.
18
20
 
19
21
  The summary table alters slightly if the results are for a destination database.
20
22
 
21
- results format:
22
- [
23
- {
24
- "server_version": "9.6.20",
25
- "max_replication_slots": "10",
26
- "max_worker_processes": "10",
27
- "max_wal_senders": "10",
28
- "shared_preload_libraries": ["pg_stat_statements", ...],
29
- "rds.logical_replication": "on",
30
- "schema: "public",
31
- "extensions": ["uuid-ossp", ...],
32
- "users": { // See pgbelt.util.postgres.precheck_info results["users"] for more info.
33
- "root": {
34
- "rolname": "root",
35
- "rolcanlogin": True,
36
- "rolcreaterole": True,
37
- "rolinherit": True,
38
- "rolsuper": True,
39
- "memberof": ["rds_superuser", ...]
40
- },
41
- "owner": {
42
- "rolname": "owner",
43
- "rolcanlogin": True,
44
- "rolcreaterole": False,
45
- "rolinherit": True,
46
- "rolsuper": False,
47
- "memberof": ["rds_superuser", ...]
23
+ Example results format::
24
+
25
+ [
26
+ {
27
+ "server_version": "9.6.20",
28
+ "max_replication_slots": "10",
29
+ "max_worker_processes": "10",
30
+ "max_wal_senders": "10",
31
+ "shared_preload_libraries": ["pg_stat_statements", ...],
32
+ "rds.logical_replication": "on",
33
+ "schema: "public",
34
+ "extensions": ["uuid-ossp", ...],
35
+ "users": { // See pgbelt.util.postgres.precheck_info results["users"] for more info.
36
+ "root": {
37
+ "rolname": "root",
38
+ "rolcanlogin": True,
39
+ "rolcreaterole": True,
40
+ "rolinherit": True,
41
+ "rolsuper": True,
42
+ "memberof": ["rds_superuser", ...]
43
+ },
44
+ "owner": {
45
+ "rolname": "owner",
46
+ "rolcanlogin": True,
47
+ "rolcreaterole": False,
48
+ "rolinherit": True,
49
+ "rolsuper": False,
50
+ "memberof": ["rds_superuser", ...]
51
+ }
48
52
  }
49
- }
50
- },
51
- ...
52
- ]
53
+ },
54
+ ...
55
+ ]
53
56
  """
54
57
 
55
58
  summary_table = [
@@ -69,6 +72,11 @@ def _summary_table(results: dict, compared_extensions: list[str] = None) -> list
69
72
  ]
70
73
 
71
74
  results.sort(key=lambda d: d["db"])
75
+ compared_by_db = (
76
+ {entry["db"]: entry for entry in compared_results}
77
+ if compared_results is not None
78
+ else {}
79
+ )
72
80
 
73
81
  for r in results:
74
82
  root_ok = (
@@ -80,9 +88,9 @@ def _summary_table(results: dict, compared_extensions: list[str] = None) -> list
80
88
  or r["users"]["root"]["rolsuper"]
81
89
  )
82
90
 
83
- # Interestingly enough, we can tell if this is being run for a destination database if the compared_extensions is not None.
91
+ # Interestingly enough, we can tell if this is being run for a destination database if the compared_results is not None.
84
92
  # This is because it is only set when we are ensuring all source extensions are in the destination.
85
- is_dest_db = compared_extensions is not None
93
+ is_dest_db = compared_results is not None
86
94
 
87
95
  # If this is a destination database, we need to check if the owner can create objects.
88
96
 
@@ -149,9 +157,13 @@ def _summary_table(results: dict, compared_extensions: list[str] = None) -> list
149
157
  # If this is a destinatino DB, we are ensuring all source extensions are in the destination.
150
158
  # If not, we don't want this column in the table.
151
159
  if is_dest_db:
160
+ compare_entry = compared_by_db.get(r["db"])
161
+ if compare_entry is None:
162
+ summary_table[-1].append(style(False, "red"))
163
+ continue
152
164
  extensions_ok = all(
153
- [e in r["extensions"] for e in compared_extensions]
154
- ) and all([e in compared_extensions for e in r["extensions"]])
165
+ [e in r["extensions"] for e in compare_entry["extensions"]]
166
+ ) and all([e in compare_entry["extensions"] for e in r["extensions"]])
155
167
  summary_table[-1].append(
156
168
  style(extensions_ok, "green" if extensions_ok else "red")
157
169
  )
@@ -165,25 +177,26 @@ def _users_table(users: dict, is_dest_db: bool = False) -> list[list]:
165
177
 
166
178
  The users table alters slightly if the results are for a destination database.
167
179
 
168
- users format:
169
- {
170
- "root": {
171
- "rolname": "root",
172
- "rolcanlogin": True,
173
- "rolcreaterole": True,
174
- "rolinherit": True,
175
- "rolsuper": True,
176
- "memberof": ["rds_superuser", ...]
177
- },
178
- "owner": {
179
- "rolname": "owner",
180
- "rolcanlogin": True,
181
- "rolcreaterole": False,
182
- "rolinherit": True,
183
- "rolsuper": False,
184
- "memberof": ["rds_superuser", ...]
180
+ Example users format::
181
+
182
+ {
183
+ "root": {
184
+ "rolname": "root",
185
+ "rolcanlogin": True,
186
+ "rolcreaterole": True,
187
+ "rolinherit": True,
188
+ "rolsuper": True,
189
+ "memberof": ["rds_superuser", ...]
190
+ },
191
+ "owner": {
192
+ "rolname": "owner",
193
+ "rolcanlogin": True,
194
+ "rolcreaterole": False,
195
+ "rolinherit": True,
196
+ "rolsuper": False,
197
+ "memberof": ["rds_superuser", ...]
198
+ }
185
199
  }
186
- }
187
200
 
188
201
  See pgbelt.util.postgres.precheck_info results["users"] for more info..
189
202
  """
@@ -250,15 +263,16 @@ def _tables_table(
250
263
  """
251
264
  Takes a list of table dicts and returns a table of the tables for echo.
252
265
 
253
- tables format:
254
- [
255
- {
256
- "Name": "table_name",
257
- "Schema": "schema_name",
258
- "Owner": "owner_name"
259
- },
260
- ...
261
- ]
266
+ Example tables format::
267
+
268
+ [
269
+ {
270
+ "Name": "table_name",
271
+ "Schema": "schema_name",
272
+ "Owner": "owner_name"
273
+ },
274
+ ...
275
+ ]
262
276
  """
263
277
 
264
278
  tables_table = [
@@ -297,15 +311,16 @@ def _sequences_table(
297
311
  """
298
312
  Takes a list of sequence dicts and returns a table of the sequences for echo.
299
313
 
300
- sequences format:
301
- [
302
- {
303
- "Name": "sequence_name",
304
- "Schema": "schema_name",
305
- "Owner": "owner_name"
306
- },
307
- ...
308
- ]
314
+ Example sequences format::
315
+
316
+ [
317
+ {
318
+ "Name": "sequence_name",
319
+ "Schema": "schema_name",
320
+ "Owner": "owner_name"
321
+ },
322
+ ...
323
+ ]
309
324
  """
310
325
 
311
326
  sequences_table = [
@@ -339,11 +354,12 @@ def _extensions_table(
339
354
  Takes a list of source and destination extensions and returns a table of the extensions for echo.
340
355
  It will flag any extensions that are not in the destination database but are in the source database.
341
356
 
342
- <source/destination>_extensions format:
343
- [
344
- "uuid-ossp",
345
- ...
346
- ]
357
+ Example extensions format::
358
+
359
+ [
360
+ "uuid-ossp",
361
+ ...
362
+ ]
347
363
 
348
364
  """
349
365
 
@@ -374,71 +390,72 @@ async def _print_prechecks(results: list[dict]) -> list[list]:
374
390
  If there are multiple databases, only print the summary table.
375
391
  If there is only one database, print the summary table and more detailed info.
376
392
 
377
- results format:
378
- [
379
- {
380
- "db": "db_name",
381
- "src": {
382
- "server_version": "9.6.20",
383
- "max_replication_slots": "10",
384
- "max_worker_processes": "10",
385
- "max_wal_senders": "10",
386
- "pg_stat_statements": "installed",
387
- "pglogical": "installed",
388
- "rds.logical_replication": "on",
389
- "schema: "public",
390
- "users": { // See pgbelt.util.postgres.precheck_info results["users"] for more info.
391
- "root": {
392
- "rolname": "root",
393
- "rolcanlogin": True,
394
- "rolcreaterole": True,
395
- "rolinherit": True,
396
- "rolsuper": True,
397
- "memberof": ["rds_superuser", ...]
398
- },
399
- "owner": {
400
- "rolname": "owner",
401
- "rolcanlogin": True,
402
- "rolcreaterole": False,
403
- "rolinherit": True,
404
- "rolsuper": False,
405
- "memberof": ["rds_superuser", ...],
406
- "can_create": True
393
+ Example results format::
394
+
395
+ [
396
+ {
397
+ "db": "db_name",
398
+ "src": {
399
+ "server_version": "9.6.20",
400
+ "max_replication_slots": "10",
401
+ "max_worker_processes": "10",
402
+ "max_wal_senders": "10",
403
+ "pg_stat_statements": "installed",
404
+ "pglogical": "installed",
405
+ "rds.logical_replication": "on",
406
+ "schema: "public",
407
+ "users": { // See pgbelt.util.postgres.precheck_info results["users"] for more info.
408
+ "root": {
409
+ "rolname": "root",
410
+ "rolcanlogin": True,
411
+ "rolcreaterole": True,
412
+ "rolinherit": True,
413
+ "rolsuper": True,
414
+ "memberof": ["rds_superuser", ...]
415
+ },
416
+ "owner": {
417
+ "rolname": "owner",
418
+ "rolcanlogin": True,
419
+ "rolcreaterole": False,
420
+ "rolinherit": True,
421
+ "rolsuper": False,
422
+ "memberof": ["rds_superuser", ...],
423
+ "can_create": True
424
+ }
407
425
  }
408
- }
409
- },
410
- "dst": {
411
- "server_version": "9.6.20",
412
- "max_replication_slots": "10",
413
- "max_worker_processes": "10",
414
- "max_wal_senders": "10",
415
- "pg_stat_statements": "installed",
416
- "pglogical": "installed",
417
- "rds.logical_replication": "on",
418
- "schema: "public",
419
- "users": { // See pgbelt.util.postgres.precheck_info results["users"] for more info.
420
- "root": {
421
- "rolname": "root",
422
- "rolcanlogin": True,
423
- "rolcreaterole": True,
424
- "rolinherit": True,
425
- "rolsuper": True,
426
- "memberof": ["rds_superuser", ...]
427
- },
428
- "owner": {
429
- "rolname": "owner",
430
- "rolcanlogin": True,
431
- "rolcreaterole": False,
432
- "rolinherit": True,
433
- "rolsuper": False,
434
- "memberof": ["rds_superuser", ...],
435
- "can_create": True
426
+ },
427
+ "dst": {
428
+ "server_version": "9.6.20",
429
+ "max_replication_slots": "10",
430
+ "max_worker_processes": "10",
431
+ "max_wal_senders": "10",
432
+ "pg_stat_statements": "installed",
433
+ "pglogical": "installed",
434
+ "rds.logical_replication": "on",
435
+ "schema: "public",
436
+ "users": { // See pgbelt.util.postgres.precheck_info results["users"] for more info.
437
+ "root": {
438
+ "rolname": "root",
439
+ "rolcanlogin": True,
440
+ "rolcreaterole": True,
441
+ "rolinherit": True,
442
+ "rolsuper": True,
443
+ "memberof": ["rds_superuser", ...]
444
+ },
445
+ "owner": {
446
+ "rolname": "owner",
447
+ "rolcanlogin": True,
448
+ "rolcreaterole": False,
449
+ "rolinherit": True,
450
+ "rolsuper": False,
451
+ "memberof": ["rds_superuser", ...],
452
+ "can_create": True
453
+ }
436
454
  }
437
455
  }
438
- }
439
- },
440
- ...
441
- ]
456
+ },
457
+ ...
458
+ ]
442
459
  """
443
460
 
444
461
  src_summaries = []
@@ -448,12 +465,9 @@ async def _print_prechecks(results: list[dict]) -> list[list]:
448
465
  dst_summaries.append(r["dst"])
449
466
 
450
467
  src_summary_table = _summary_table(src_summaries)
451
- dst_summary_table = _summary_table(
452
- dst_summaries, compared_extensions=r["src"]["extensions"]
453
- )
468
+ dst_summary_table = _summary_table(dst_summaries, compared_results=src_summaries)
454
469
 
455
470
  if len(results) != 1:
456
-
457
471
  # For mulitple databases, we only print the summary table.
458
472
 
459
473
  src_multi_display_string = (
@@ -564,7 +578,7 @@ async def _print_prechecks(results: list[dict]) -> list[list]:
564
578
  return src_summary_table, dst_summary_table
565
579
 
566
580
 
567
- @run_with_configs(skip_dst=True, results_callback=_print_prechecks)
581
+ @run_with_configs(results_callback=_print_prechecks)
568
582
  async def precheck(config_future: Awaitable[DbupgradeConfig]) -> dict:
569
583
  """
570
584
  Report whether your source database meets the basic requirements for pgbelt.
pgbelt/util/dump.py CHANGED
@@ -76,6 +76,33 @@ async def _execute_subprocess(
76
76
  return out
77
77
 
78
78
 
79
+ async def _dump_table(config: DbupgradeConfig, table: str, logger: Logger) -> None:
80
+ """
81
+ Dump a single table using pg_dump, strip unwanted lines, and save to file.
82
+ """
83
+ command = [
84
+ "pg_dump",
85
+ "--data-only",
86
+ f'--table={config.schema_name}."{table}"',
87
+ config.src.pglogical_dsn,
88
+ ]
89
+
90
+ out = await _execute_subprocess(command, f"dumped {table}", logger)
91
+ content = out.decode("utf-8")
92
+
93
+ # Strip out unwanted lines, stupid PG17 adding transaction_timeout lines.
94
+ keywords = ["transaction_timeout"]
95
+ lines = content.split("\n")
96
+ filtered_lines = [
97
+ line for line in lines if not any(keyword in line for keyword in keywords)
98
+ ]
99
+ filtered_content = "\n".join(filtered_lines)
100
+
101
+ # Write the filtered content to file
102
+ async with aopen(table_file(config.db, config.dc, table), "w") as f:
103
+ await f.write(filtered_content)
104
+
105
+
79
106
  async def dump_source_tables(
80
107
  config: DbupgradeConfig, tables: list[str], logger: Logger
81
108
  ) -> None:
@@ -88,21 +115,7 @@ async def dump_source_tables(
88
115
 
89
116
  dumps = []
90
117
  for table in tables:
91
- dumps.append(
92
- _execute_subprocess(
93
- [
94
- "pg_dump",
95
- "--data-only",
96
- f'--table={config.schema_name}."{table}"',
97
- "-Fc",
98
- "-f",
99
- table_file(config.db, config.dc, table),
100
- config.src.pglogical_dsn,
101
- ],
102
- f"dumped {table}",
103
- logger,
104
- )
105
- )
118
+ dumps.append(_dump_table(config, table, logger))
106
119
 
107
120
  await asyncio.gather(*dumps)
108
121
 
@@ -137,9 +150,9 @@ async def load_dumped_tables(
137
150
  loads.append(
138
151
  _execute_subprocess(
139
152
  [
140
- "pg_restore",
141
- "-d",
153
+ "psql",
142
154
  config.dst.owner_dsn,
155
+ "-f",
143
156
  file,
144
157
  ],
145
158
  f"loaded {file}",
@@ -204,7 +217,7 @@ async def dump_source_schema(config: DbupgradeConfig, logger: Logger) -> None:
204
217
  schema_file(config.db, config.dc, NO_INVALID_NO_INDEX), "w"
205
218
  ) as out:
206
219
  for command in commands:
207
- if not ("NOT VALID" in command) and not (
220
+ if "NOT VALID" not in command and not (
208
221
  "CREATE" in command and "INDEX" in command
209
222
  ):
210
223
  await out.write(command)
@@ -305,13 +318,13 @@ async def remove_dst_not_valid_constraints(
305
318
  if not regex_matches:
306
319
  continue
307
320
  table = regex_matches.groupdict()["table"]
308
- constraint = table = regex_matches.groupdict()["constraint"]
321
+ constraint = regex_matches.groupdict()["constraint"]
309
322
 
310
323
  if (config.tables and table in config.tables) or not config.tables:
311
324
  queries = queries + f"ALTER TABLE {table} DROP CONSTRAINT {constraint};"
312
325
 
313
326
  if queries != "":
314
- command = ["psql", config.dst.owner_dsn, "-c", f"'{queries}'"]
327
+ command = ["psql", config.dst.owner_dsn, "-c", queries]
315
328
 
316
329
  await _execute_subprocess(
317
330
  command, "Finished removing NOT VALID constraints from the target.", logger
pgbelt/util/logs.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ from datetime import datetime
2
3
  from os import getenv
3
4
  from os import makedirs
4
5
 
@@ -8,7 +9,7 @@ FORMATTER = "{asctime} {name}:{levelname} {message}"
8
9
  # if this module is ever imported we set up the root logger to log to stderr
9
10
  root_level = int(getenv("LOG_LEVEL", logging.DEBUG))
10
11
  root_handler = logging.StreamHandler()
11
- formatter = logging.Formatter(fmt=FORMATTER, datefmt='%Y-%m-%d %H:%M:%S', style='{')
12
+ formatter = logging.Formatter(fmt=FORMATTER, datefmt="%Y-%m-%d %H:%M:%S", style="{")
12
13
  root_handler.setFormatter(formatter)
13
14
  root_handler.setLevel(root_level)
14
15
  root_logger = logging.getLogger("dbup")
@@ -20,13 +21,21 @@ def log_file_dir(db: str, dc: str) -> str:
20
21
  return f"logs/{db}/{dc}"
21
22
 
22
23
 
23
- def log_file_path(db: str, dc: str) -> str:
24
- return f"logs/{db}/{dc}/logs.txt"
24
+ def log_file_path(db: str, dc: str, kind: str) -> str:
25
+ timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
26
+ if kind:
27
+ return f"logs/{db}/{dc}/{timestamp}-{kind}.txt"
28
+ else:
29
+ return f"logs/{db}/{dc}/{timestamp}.txt"
25
30
 
26
31
 
27
32
  def get_logger(db: str, dc: str, kind: str = "") -> logging.Logger:
28
33
  # When we set up a logger for that db that emits to a file
29
- logger = logging.getLogger(f"dbup.{db}.{dc}")
34
+ logger = (
35
+ logging.getLogger(f"dbup.{db}.{dc}.{kind}")
36
+ if kind
37
+ else logging.getLogger(f"dbup.{db}.{dc}")
38
+ )
30
39
  if not logger.handlers:
31
40
  skip_file_handler = False
32
41
 
@@ -41,8 +50,10 @@ def get_logger(db: str, dc: str, kind: str = "") -> logging.Logger:
41
50
  pass
42
51
 
43
52
  if not skip_file_handler:
44
- handler = logging.FileHandler(log_file_path(db, dc), mode="w")
45
- handler.setFormatter(logging.Formatter(FORMATTER, datefmt='%Y-%m-%d %H:%M:%S', style="{"))
53
+ handler = logging.FileHandler(log_file_path(db, dc, kind), mode="w")
54
+ handler.setFormatter(
55
+ logging.Formatter(FORMATTER, datefmt="%Y-%m-%d %H:%M:%S", style="{")
56
+ )
46
57
  # always log everything to the file
47
58
  logger.setLevel(logging.DEBUG)
48
59
  logger.addHandler(handler)
pgbelt/util/postgres.py CHANGED
@@ -551,7 +551,7 @@ async def initialization_progress(
551
551
  if src_dataset_size["db_size"] == 0 and dst_dataset_size["db_size"] == 0:
552
552
  progress = "0 %"
553
553
  else:
554
- progress = f"{str(round(int(dst_dataset_size['db_size'])/int(src_dataset_size['db_size'])*100 ,1))} %"
554
+ progress = f"{str(round(int(dst_dataset_size['db_size']) / int(src_dataset_size['db_size']) * 100, 1))} %"
555
555
 
556
556
  status = {
557
557
  "src_dataset_size": src_dataset_size["db_size_pretty"] or "0 bytes",
@@ -1,21 +1,20 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pgbelt
3
- Version: 0.8.2
3
+ Version: 0.9.2
4
4
  Summary: A CLI tool used to manage Postgres data migrations from beginning to end, for a single database or a fleet, leveraging pglogical replication.
5
+ License-File: LICENSE
5
6
  Author: Varjitt Jeeva
6
7
  Author-email: varjitt.jeeva@autodesk.com
7
- Requires-Python: >=3.9,<4.0
8
+ Requires-Python: >=3.12,<4.0
8
9
  Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.9
10
- Classifier: Programming Language :: Python :: 3.10
11
- Classifier: Programming Language :: Python :: 3.11
12
10
  Classifier: Programming Language :: Python :: 3.12
13
11
  Classifier: Programming Language :: Python :: 3.13
12
+ Classifier: Programming Language :: Python :: 3.14
14
13
  Requires-Dist: aiofiles (>=0.8,<24.2)
15
- Requires-Dist: asyncpg (>=0.27,<0.31)
14
+ Requires-Dist: asyncpg (>=0.27,<0.32)
16
15
  Requires-Dist: pydantic (>=2.0,<3.0)
17
16
  Requires-Dist: tabulate (>=0.9.0,<0.10.0)
18
- Requires-Dist: typer (>=0.9,<0.16)
17
+ Requires-Dist: typer (>=0.9,<0.22)
19
18
  Description-Content-Type: text/markdown
20
19
 
21
20
  # Pgbelt
@@ -3,7 +3,7 @@ pgbelt/cmd/__init__.py,sha256=28SxbIChyvJ1mLoI8XJQPrPPwKA6852V9jtnFm8R0Nw,462
3
3
  pgbelt/cmd/convenience.py,sha256=RY762BYoyOccmhHqSOaHWIPVBzY4kU0qZautTprGps0,5857
4
4
  pgbelt/cmd/helpers.py,sha256=anMAkZjJRy7n0EwewyMNJGJ4Jx9keSNZdzWqi3ICNgI,5292
5
5
  pgbelt/cmd/login.py,sha256=FNg7shEIC2iwiDjOMza2ZvBv_33U1GMKRh51vsGMTb8,3351
6
- pgbelt/cmd/preflight.py,sha256=-78Puqqf1rCxNQEyn4bQIAORez_tsy6zJAbSuO_de9s,20676
6
+ pgbelt/cmd/preflight.py,sha256=GH2IE-yb1HvbpwSwm-jJG1dnRO9CXfSsTH5OqYEVyv4,21557
7
7
  pgbelt/cmd/schema.py,sha256=OuxJdUILxlNCvaBV71Si8035pX3LVwHm5Urt0vftO8E,4389
8
8
  pgbelt/cmd/setup.py,sha256=Jp5sqT9_whoVBiOzAlOzX1ubtXQADYBkBrJldch_fKk,6627
9
9
  pgbelt/cmd/status.py,sha256=8K1c2OMZ3uHNmEh-5a2a0fhTDmCU0RohzgjjVfXoKGo,5385
@@ -16,12 +16,12 @@ pgbelt/config/remote.py,sha256=D9bOekVfMU1xX2Wy0OiJwSXetxJUdt9Tn5Fukwn9rnE,5307
16
16
  pgbelt/main.py,sha256=YiagBiGt8pbNlukkRxROXnQX1Tx6ax7c6riuHRCrPYU,186
17
17
  pgbelt/util/__init__.py,sha256=-6KkvVMz-yGNQfeoo4CZZrgWKXYmFd4CMyoiao8OnFE,40
18
18
  pgbelt/util/asyncfuncs.py,sha256=7i_GpBmUNNZ8RUGvU-q5nclsoaCm6Lx8jLP8usYvmZc,583
19
- pgbelt/util/dump.py,sha256=R5eI1MFwbv5M6ICnkmjhugj3ZhpWu5sjT20ixEXNfC4,14218
20
- pgbelt/util/logs.py,sha256=E6doEhi8vrusmYUTZRdjKHP-h2dDiExCjgEtMl7epPw,1793
19
+ pgbelt/util/dump.py,sha256=W814ULJPM9IBEhmvMFRD2E8DkqTuXZRuRtLXT8k4xhU,14691
20
+ pgbelt/util/logs.py,sha256=3Kk_dERXLsTwLxFS6tzI8fE0sRi5QrBYHJc4Al6ZCMA,2110
21
21
  pgbelt/util/pglogical.py,sha256=Y6KZBeiH85zhNSvhATqh0xozhfUMyQnPWN1HwRosZFo,13613
22
- pgbelt/util/postgres.py,sha256=0Jx0auJZsSigDX57M1J9ntN1booL1AUxPc8oBYzsbUE,20076
23
- pgbelt-0.8.2.dist-info/LICENSE,sha256=FQ5cFkW02dKK3LmKH8z-rwn93tWSCh7lsxfNUiWcFsg,10758
24
- pgbelt-0.8.2.dist-info/METADATA,sha256=dhrSqkEUjn642o_hu0sZn8zUhCQLAMDZmUZSqrBmY4s,3011
25
- pgbelt-0.8.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
26
- pgbelt-0.8.2.dist-info/entry_points.txt,sha256=SCz_poPjkaVnWpJ-CeytAnDzbVc6l0WalOwitIqW_3g,40
27
- pgbelt-0.8.2.dist-info/RECORD,,
22
+ pgbelt/util/postgres.py,sha256=ftBontoWkU7XaDXaBnsSJYYx7s2Su0xkcTyVCzwKJm0,20080
23
+ pgbelt-0.9.2.dist-info/METADATA,sha256=we33iVu7QH6GjgfHHqzL9ISEfq73y2S8gf5wySkPHHQ,2933
24
+ pgbelt-0.9.2.dist-info/WHEEL,sha256=kJCRJT_g0adfAJzTx2GUMmS80rTJIVHRCfG0DQgLq3o,88
25
+ pgbelt-0.9.2.dist-info/entry_points.txt,sha256=SCz_poPjkaVnWpJ-CeytAnDzbVc6l0WalOwitIqW_3g,40
26
+ pgbelt-0.9.2.dist-info/licenses/LICENSE,sha256=FQ5cFkW02dKK3LmKH8z-rwn93tWSCh7lsxfNUiWcFsg,10758
27
+ pgbelt-0.9.2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.1
2
+ Generator: poetry-core 2.3.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any