pgbelt 0.1.2__py3-none-any.whl → 0.2.0__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/convenience.py +3 -5
- pgbelt/cmd/helpers.py +8 -10
- pgbelt/cmd/login.py +1 -2
- pgbelt/cmd/preflight.py +3 -3
- pgbelt/cmd/schema.py +1 -1
- pgbelt/cmd/setup.py +2 -3
- pgbelt/cmd/status.py +4 -5
- pgbelt/cmd/sync.py +4 -4
- pgbelt/cmd/teardown.py +2 -3
- pgbelt/config/config.py +5 -6
- pgbelt/config/models.py +10 -11
- pgbelt/config/remote.py +5 -6
- pgbelt/main.py +1 -2
- pgbelt/util/dump.py +6 -12
- pgbelt/util/postgres.py +1 -2
- {pgbelt-0.1.2.dist-info → pgbelt-0.2.0.dist-info}/METADATA +8 -9
- pgbelt-0.2.0.dist-info/RECORD +27 -0
- {pgbelt-0.1.2.dist-info → pgbelt-0.2.0.dist-info}/WHEEL +1 -1
- pgbelt-0.1.2.dist-info/RECORD +0 -27
- {pgbelt-0.1.2.dist-info → pgbelt-0.2.0.dist-info}/LICENSE +0 -0
- {pgbelt-0.1.2.dist-info → pgbelt-0.2.0.dist-info}/entry_points.txt +0 -0
pgbelt/cmd/convenience.py
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
from asyncio import run
|
|
2
2
|
from logging import Logger
|
|
3
|
-
from typing import Tuple
|
|
4
3
|
|
|
5
4
|
from asyncpg import create_pool
|
|
6
|
-
from typer import echo
|
|
7
|
-
from typer import Option
|
|
8
|
-
|
|
9
5
|
from pgbelt.config.config import get_config
|
|
10
6
|
from pgbelt.config.models import DbupgradeConfig
|
|
11
7
|
from pgbelt.util.logs import get_logger
|
|
12
8
|
from pgbelt.util.postgres import analyze_table_pkeys
|
|
9
|
+
from typer import echo
|
|
10
|
+
from typer import Option
|
|
13
11
|
|
|
14
12
|
|
|
15
13
|
def src_dsn(
|
|
@@ -58,7 +56,7 @@ def dst_dsn(
|
|
|
58
56
|
|
|
59
57
|
async def _check_pkeys(
|
|
60
58
|
conf: DbupgradeConfig, logger: Logger
|
|
61
|
-
) ->
|
|
59
|
+
) -> tuple[list[str], list[str]]:
|
|
62
60
|
async with create_pool(conf.src.root_uri, min_size=1) as pool:
|
|
63
61
|
pkey_tables, no_pkey_tables, _ = await analyze_table_pkeys(pool, logger)
|
|
64
62
|
return pkey_tables, no_pkey_tables
|
pgbelt/cmd/helpers.py
CHANGED
|
@@ -1,30 +1,28 @@
|
|
|
1
1
|
from asyncio import gather
|
|
2
2
|
from asyncio import run
|
|
3
|
+
from collections.abc import Awaitable
|
|
4
|
+
from collections.abc import Callable
|
|
3
5
|
from functools import wraps
|
|
4
6
|
from inspect import iscoroutinefunction
|
|
5
7
|
from inspect import Parameter
|
|
6
8
|
from inspect import signature
|
|
7
9
|
from typing import Any
|
|
8
|
-
from typing import Awaitable
|
|
9
|
-
from typing import Callable
|
|
10
|
-
from typing import Optional
|
|
11
10
|
from typing import TypeVar
|
|
12
11
|
|
|
13
|
-
from typer import Argument
|
|
14
|
-
from typer import Typer
|
|
15
|
-
|
|
16
12
|
from pgbelt.config import get_all_configs_async
|
|
17
13
|
from pgbelt.config import get_config_async
|
|
14
|
+
from typer import Argument
|
|
15
|
+
from typer import Typer
|
|
18
16
|
|
|
19
17
|
|
|
20
18
|
T = TypeVar("T")
|
|
21
19
|
|
|
22
20
|
|
|
23
21
|
def run_with_configs(
|
|
24
|
-
decorated_func: Callable[..., Awaitable[
|
|
22
|
+
decorated_func: Callable[..., Awaitable[T | None]] = None,
|
|
25
23
|
skip_src: bool = False,
|
|
26
24
|
skip_dst: bool = False,
|
|
27
|
-
results_callback:
|
|
25
|
+
results_callback: Callable[[list[T]], Awaitable[Any | None]] | None = None,
|
|
28
26
|
) -> Callable:
|
|
29
27
|
"""
|
|
30
28
|
Decorator for async commands. Implementations should take one Awaitable[DbupgradeConfig] arg
|
|
@@ -52,7 +50,7 @@ def run_with_configs(
|
|
|
52
50
|
|
|
53
51
|
# The name, docstring, and signature of the implementation is preserved. Important for add_command
|
|
54
52
|
@wraps(func)
|
|
55
|
-
async def wrapper(dc: str, db:
|
|
53
|
+
async def wrapper(dc: str, db: str | None, **kwargs):
|
|
56
54
|
# If db is specified we only want to run on one of them
|
|
57
55
|
if db is not None:
|
|
58
56
|
results = [
|
|
@@ -102,7 +100,7 @@ def add_command(app: Typer, command: Callable):
|
|
|
102
100
|
if iscoroutinefunction(command):
|
|
103
101
|
|
|
104
102
|
@app.command(name=name)
|
|
105
|
-
def cmdwrapper(dc: str, db:
|
|
103
|
+
def cmdwrapper(dc: str, db: str | None = Argument(None), **kwargs):
|
|
106
104
|
run(command(dc, db, **kwargs))
|
|
107
105
|
|
|
108
106
|
# Synchronous commands can only be run on one db at a time
|
pgbelt/cmd/login.py
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
from collections.abc import Awaitable
|
|
2
3
|
from logging import Logger
|
|
3
|
-
from typing import Awaitable
|
|
4
4
|
|
|
5
5
|
from asyncpg import create_pool
|
|
6
6
|
from asyncpg import Pool
|
|
7
|
-
|
|
8
7
|
from pgbelt.cmd.helpers import run_with_configs
|
|
9
8
|
from pgbelt.config.models import DbConfig
|
|
10
9
|
from pgbelt.config.models import DbupgradeConfig
|
pgbelt/cmd/preflight.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
from asyncio import gather
|
|
2
|
+
from collections.abc import Awaitable
|
|
3
|
+
|
|
4
|
+
from asyncpg import create_pool
|
|
2
5
|
from pgbelt.cmd.helpers import run_with_configs
|
|
3
6
|
from pgbelt.config.models import DbupgradeConfig
|
|
4
7
|
from pgbelt.util.logs import get_logger
|
|
5
8
|
from pgbelt.util.postgres import analyze_table_pkeys
|
|
6
9
|
from pgbelt.util.postgres import precheck_info
|
|
7
|
-
from typing import Awaitable
|
|
8
|
-
|
|
9
|
-
from asyncpg import create_pool
|
|
10
10
|
from tabulate import tabulate
|
|
11
11
|
from typer import echo
|
|
12
12
|
from typer import style
|
pgbelt/cmd/schema.py
CHANGED
pgbelt/cmd/setup.py
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
from asyncio import create_task
|
|
2
2
|
from asyncio import gather
|
|
3
|
+
from collections.abc import Awaitable
|
|
3
4
|
from logging import Logger
|
|
4
|
-
from typing import Awaitable
|
|
5
5
|
|
|
6
6
|
from asyncpg import create_pool
|
|
7
7
|
from asyncpg import Pool
|
|
8
|
-
from typer import Option
|
|
9
|
-
|
|
10
8
|
from pgbelt.cmd.helpers import run_with_configs
|
|
11
9
|
from pgbelt.config.models import DbupgradeConfig
|
|
12
10
|
from pgbelt.util.dump import apply_target_schema
|
|
@@ -18,6 +16,7 @@ from pgbelt.util.pglogical import configure_replication_set
|
|
|
18
16
|
from pgbelt.util.pglogical import configure_subscription
|
|
19
17
|
from pgbelt.util.pglogical import grant_pgl
|
|
20
18
|
from pgbelt.util.postgres import analyze_table_pkeys
|
|
19
|
+
from typer import Option
|
|
21
20
|
|
|
22
21
|
|
|
23
22
|
async def _dump_and_load_schema(
|
pgbelt/cmd/status.py
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
from asyncio import gather
|
|
2
|
-
from
|
|
2
|
+
from collections.abc import Awaitable
|
|
3
3
|
|
|
4
4
|
from asyncpg import create_pool
|
|
5
|
-
from tabulate import tabulate
|
|
6
|
-
from typer import echo
|
|
7
|
-
from typer import style
|
|
8
|
-
|
|
9
5
|
from pgbelt.cmd.helpers import run_with_configs
|
|
10
6
|
from pgbelt.config.models import DbupgradeConfig
|
|
11
7
|
from pgbelt.util import get_logger
|
|
12
8
|
from pgbelt.util.pglogical import dst_status
|
|
13
9
|
from pgbelt.util.pglogical import src_status
|
|
10
|
+
from tabulate import tabulate
|
|
11
|
+
from typer import echo
|
|
12
|
+
from typer import style
|
|
14
13
|
|
|
15
14
|
|
|
16
15
|
async def _print_status_table(results: list[dict[str, str]]) -> list[list[str]]:
|
pgbelt/cmd/sync.py
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
from asyncio import gather
|
|
2
|
+
from collections.abc import Awaitable
|
|
2
3
|
from logging import Logger
|
|
4
|
+
|
|
5
|
+
from asyncpg import create_pool
|
|
6
|
+
from asyncpg import Pool
|
|
3
7
|
from pgbelt.cmd.helpers import run_with_configs
|
|
4
8
|
from pgbelt.config.models import DbupgradeConfig
|
|
5
9
|
from pgbelt.util.dump import apply_target_constraints
|
|
@@ -12,10 +16,6 @@ from pgbelt.util.postgres import compare_latest_100_rows
|
|
|
12
16
|
from pgbelt.util.postgres import dump_sequences
|
|
13
17
|
from pgbelt.util.postgres import load_sequences
|
|
14
18
|
from pgbelt.util.postgres import run_analyze
|
|
15
|
-
from typing import Awaitable
|
|
16
|
-
|
|
17
|
-
from asyncpg import create_pool
|
|
18
|
-
from asyncpg import Pool
|
|
19
19
|
from typer import Option
|
|
20
20
|
|
|
21
21
|
|
pgbelt/cmd/teardown.py
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
from asyncio import gather
|
|
2
2
|
from asyncio import sleep
|
|
3
|
-
from
|
|
3
|
+
from collections.abc import Awaitable
|
|
4
4
|
|
|
5
5
|
from asyncpg import create_pool
|
|
6
|
-
from typer import Option
|
|
7
|
-
|
|
8
6
|
from pgbelt.cmd.helpers import run_with_configs
|
|
9
7
|
from pgbelt.config.models import DbupgradeConfig
|
|
10
8
|
from pgbelt.util.logs import get_logger
|
|
@@ -13,6 +11,7 @@ from pgbelt.util.pglogical import teardown_node
|
|
|
13
11
|
from pgbelt.util.pglogical import teardown_pgl
|
|
14
12
|
from pgbelt.util.pglogical import teardown_replication_set
|
|
15
13
|
from pgbelt.util.pglogical import teardown_subscription
|
|
14
|
+
from typer import Option
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
@run_with_configs(skip_dst=True)
|
pgbelt/config/config.py
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
from collections.abc import AsyncGenerator
|
|
3
|
+
from collections.abc import Awaitable
|
|
2
4
|
from os.path import join
|
|
3
|
-
from typing import AsyncGenerator
|
|
4
|
-
from typing import Awaitable
|
|
5
|
-
from typing import Optional
|
|
6
5
|
|
|
7
6
|
from pgbelt.config.models import DbupgradeConfig
|
|
8
7
|
from pgbelt.config.remote import resolve_remote_config
|
|
@@ -14,7 +13,7 @@ from pgbelt.util.asyncfuncs import listdir
|
|
|
14
13
|
|
|
15
14
|
def get_config(
|
|
16
15
|
db: str, dc: str, skip_src: bool = False, skip_dst: bool = False
|
|
17
|
-
) ->
|
|
16
|
+
) -> DbupgradeConfig | None:
|
|
18
17
|
"""
|
|
19
18
|
Get a configuration for one database pair synchronously.
|
|
20
19
|
"""
|
|
@@ -28,7 +27,7 @@ def get_config(
|
|
|
28
27
|
|
|
29
28
|
async def get_config_async(
|
|
30
29
|
db: str, dc: str, skip_src: bool = False, skip_dst: bool = False
|
|
31
|
-
) ->
|
|
30
|
+
) -> DbupgradeConfig | None:
|
|
32
31
|
"""
|
|
33
32
|
Get configuration for one database pair asynchronously. Always prefers
|
|
34
33
|
locally cached configuration but attempts to resolve any uncached configuration
|
|
@@ -84,7 +83,7 @@ async def find_available_configs(confdir: str, dc: str) -> set[str]:
|
|
|
84
83
|
|
|
85
84
|
async def get_all_configs_async(
|
|
86
85
|
dc: str, skip_src: bool = False, skip_dst: bool = False
|
|
87
|
-
) -> AsyncGenerator[Awaitable[
|
|
86
|
+
) -> AsyncGenerator[Awaitable[DbupgradeConfig | None], None]:
|
|
88
87
|
"""
|
|
89
88
|
A generator that produces Awaitables that resolve to DbupgradeConfigs or None
|
|
90
89
|
|
pgbelt/config/models.py
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from os.path import join
|
|
4
|
-
from pgbelt.util import get_logger
|
|
5
|
-
from pgbelt.util.asyncfuncs import makedirs
|
|
6
|
-
from typing import Optional
|
|
7
4
|
|
|
8
5
|
from aiofiles import open as aopen
|
|
9
6
|
from aiofiles.os import remove
|
|
7
|
+
from pgbelt.util import get_logger
|
|
8
|
+
from pgbelt.util.asyncfuncs import makedirs
|
|
10
9
|
from pydantic import BaseModel
|
|
11
10
|
from pydantic import ValidationError
|
|
12
11
|
from pydantic import validator
|
|
@@ -20,7 +19,7 @@ def config_file(db: str, dc: str) -> str:
|
|
|
20
19
|
return join(config_dir(db, dc), "config.json")
|
|
21
20
|
|
|
22
21
|
|
|
23
|
-
def not_empty(v) ->
|
|
22
|
+
def not_empty(v) -> str | None:
|
|
24
23
|
if v == "":
|
|
25
24
|
raise ValueError
|
|
26
25
|
return v
|
|
@@ -35,7 +34,7 @@ class User(BaseModel):
|
|
|
35
34
|
"""
|
|
36
35
|
|
|
37
36
|
name: str
|
|
38
|
-
pw:
|
|
37
|
+
pw: str | None = None
|
|
39
38
|
|
|
40
39
|
_not_empty = validator("name", "pw", allow_reuse=True)(not_empty)
|
|
41
40
|
|
|
@@ -62,7 +61,7 @@ class DbConfig(BaseModel):
|
|
|
62
61
|
root_user: User
|
|
63
62
|
owner_user: User
|
|
64
63
|
pglogical_user: User
|
|
65
|
-
other_users:
|
|
64
|
+
other_users: list[User] | None = None
|
|
66
65
|
|
|
67
66
|
_not_empty = validator("host", "ip", "db", "port", allow_reuse=True)(not_empty)
|
|
68
67
|
|
|
@@ -109,10 +108,10 @@ class DbupgradeConfig(BaseModel):
|
|
|
109
108
|
|
|
110
109
|
db: str
|
|
111
110
|
dc: str
|
|
112
|
-
src:
|
|
113
|
-
dst:
|
|
114
|
-
tables:
|
|
115
|
-
sequences:
|
|
111
|
+
src: DbConfig | None = None
|
|
112
|
+
dst: DbConfig | None = None
|
|
113
|
+
tables: list[str] | None = None
|
|
114
|
+
sequences: list[str] | None = None
|
|
116
115
|
|
|
117
116
|
_not_empty = validator("db", "dc", allow_reuse=True)(not_empty)
|
|
118
117
|
|
|
@@ -147,7 +146,7 @@ class DbupgradeConfig(BaseModel):
|
|
|
147
146
|
logger.info("Cached config to disk.")
|
|
148
147
|
|
|
149
148
|
@classmethod
|
|
150
|
-
async def load(cls, db: str, dc: str) ->
|
|
149
|
+
async def load(cls, db: str, dc: str) -> DbupgradeConfig | None:
|
|
151
150
|
"""
|
|
152
151
|
Load the specified configuration from disk if present.
|
|
153
152
|
If the existing config is invalid or does not exist return None.
|
pgbelt/config/remote.py
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
from importlib import import_module
|
|
2
2
|
from json import JSONDecodeError
|
|
3
3
|
from logging import Logger
|
|
4
|
-
from pgbelt.config.models import DbupgradeConfig
|
|
5
|
-
from pgbelt.util.logs import get_logger
|
|
6
|
-
from typing import Optional
|
|
7
4
|
|
|
8
5
|
from aiofiles import open as aopen
|
|
6
|
+
from pgbelt.config.models import DbupgradeConfig
|
|
7
|
+
from pgbelt.util.logs import get_logger
|
|
9
8
|
from pydantic import BaseModel
|
|
10
9
|
from pydantic import ValidationError
|
|
11
10
|
|
|
@@ -60,7 +59,7 @@ class BaseResolver(BaseModel):
|
|
|
60
59
|
arbitrary_types_allowed = True
|
|
61
60
|
extra = "ignore"
|
|
62
61
|
|
|
63
|
-
async def resolve(self) ->
|
|
62
|
+
async def resolve(self) -> DbupgradeConfig | None:
|
|
64
63
|
"""
|
|
65
64
|
Called to retrieve the configuration from wherever your resolver gets it.
|
|
66
65
|
Return configuration as a DbupgradeConfig.
|
|
@@ -73,7 +72,7 @@ class BaseResolver(BaseModel):
|
|
|
73
72
|
|
|
74
73
|
async def load_remote_conf_def(
|
|
75
74
|
config_file: str, logger: Logger
|
|
76
|
-
) ->
|
|
75
|
+
) -> RemoteConfigDefinition | None:
|
|
77
76
|
try:
|
|
78
77
|
logger.debug(f"Reading remote config definition from file {config_file}")
|
|
79
78
|
async with aopen(config_file, mode="r") as f:
|
|
@@ -90,7 +89,7 @@ async def load_remote_conf_def(
|
|
|
90
89
|
|
|
91
90
|
async def resolve_remote_config(
|
|
92
91
|
db: str, dc: str, skip_src: bool = False, skip_dst: bool = False
|
|
93
|
-
) ->
|
|
92
|
+
) -> DbupgradeConfig | None:
|
|
94
93
|
"""
|
|
95
94
|
Loads the referenced remote configuration json file, tries to import the
|
|
96
95
|
specified resolver class, executes its resolve method, and returns the
|
pgbelt/main.py
CHANGED
pgbelt/util/dump.py
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
from logging import Logger
|
|
3
3
|
from os.path import join
|
|
4
|
-
from re import search
|
|
5
|
-
|
|
6
|
-
from aiofiles import open as aopen
|
|
7
|
-
from asyncpg import create_pool
|
|
8
|
-
|
|
9
4
|
from pgbelt.config.models import DbupgradeConfig
|
|
10
5
|
from pgbelt.util.asyncfuncs import isfile
|
|
11
6
|
from pgbelt.util.asyncfuncs import listdir
|
|
12
7
|
from pgbelt.util.asyncfuncs import makedirs
|
|
13
8
|
from pgbelt.util.postgres import table_empty
|
|
9
|
+
from re import search
|
|
10
|
+
|
|
11
|
+
from aiofiles import open as aopen
|
|
12
|
+
from asyncpg import create_pool
|
|
14
13
|
|
|
15
14
|
RAW = "schema"
|
|
16
15
|
NO_INVALID = "no_invalid_constraints"
|
|
@@ -33,7 +32,7 @@ def table_file(db: str, dc: str, name: str) -> str:
|
|
|
33
32
|
return join(table_dir(db, dc), f"{name}.sql")
|
|
34
33
|
|
|
35
34
|
|
|
36
|
-
def _parse_dump_commands(out: str
|
|
35
|
+
def _parse_dump_commands(out: str) -> list[str]:
|
|
37
36
|
"""
|
|
38
37
|
Given a string containing output from pg_dump, return a list of strings where
|
|
39
38
|
each is a complete postgres command. Commands may be multi-line.
|
|
@@ -47,9 +46,6 @@ def _parse_dump_commands(out: str, src_owner: str, dst_owner: str) -> list[str]:
|
|
|
47
46
|
if not stripped or stripped.startswith("--"):
|
|
48
47
|
continue
|
|
49
48
|
|
|
50
|
-
# replace source owner user with target owner user
|
|
51
|
-
line = line.replace(src_owner, dst_owner)
|
|
52
|
-
|
|
53
49
|
# if the last command is terminated or we don't have any yet start a new one
|
|
54
50
|
if not commands or commands[-1].endswith(";\n"):
|
|
55
51
|
commands.append(line + "\n")
|
|
@@ -172,9 +168,7 @@ async def dump_source_schema(config: DbupgradeConfig, logger: Logger) -> None:
|
|
|
172
168
|
|
|
173
169
|
out = await _execute_subprocess(command, "Retrieved source schema", logger)
|
|
174
170
|
|
|
175
|
-
commands_raw = _parse_dump_commands(
|
|
176
|
-
out.decode("utf-8"), config.src.owner_user.name, config.dst.owner_user.name
|
|
177
|
-
)
|
|
171
|
+
commands_raw = _parse_dump_commands(out.decode("utf-8"))
|
|
178
172
|
|
|
179
173
|
commands = []
|
|
180
174
|
for c in commands_raw:
|
pgbelt/util/postgres.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
from logging import Logger
|
|
2
|
-
from typing import Tuple
|
|
3
2
|
|
|
4
3
|
from asyncpg import Pool
|
|
5
4
|
from asyncpg import Record
|
|
@@ -211,7 +210,7 @@ async def table_empty(pool: Pool, table: str, logger: Logger) -> bool:
|
|
|
211
210
|
|
|
212
211
|
async def analyze_table_pkeys(
|
|
213
212
|
pool: Pool, logger: Logger
|
|
214
|
-
) ->
|
|
213
|
+
) -> tuple[list[str], list[str], Record]:
|
|
215
214
|
"""
|
|
216
215
|
return three lists of table names. the first element is all tables
|
|
217
216
|
with pkeys in public and the second is all tables without pkeys in public.
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pgbelt
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
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
5
|
Author: Varjitt Jeeva
|
|
6
6
|
Author-email: varjitt.jeeva@autodesk.com
|
|
7
|
-
Requires-Python: >=3.
|
|
7
|
+
Requires-Python: >=3.11,<4.0
|
|
8
8
|
Classifier: Programming Language :: Python :: 3
|
|
9
|
-
Classifier: Programming Language :: Python :: 3.
|
|
10
|
-
|
|
11
|
-
Requires-Dist:
|
|
12
|
-
Requires-Dist:
|
|
13
|
-
Requires-Dist:
|
|
14
|
-
Requires-Dist:
|
|
15
|
-
Requires-Dist: typer (>=0.6.1,<0.7.0)
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
10
|
+
Requires-Dist: aiofiles (>=0.8,<23.2)
|
|
11
|
+
Requires-Dist: asyncpg (>=0.27.0,<0.28.0)
|
|
12
|
+
Requires-Dist: pydantic (>=1.10.0,<2.0.0)
|
|
13
|
+
Requires-Dist: tabulate (>=0.9.0,<0.10.0)
|
|
14
|
+
Requires-Dist: typer (>=0.7.0,<0.8.0)
|
|
16
15
|
Description-Content-Type: text/markdown
|
|
17
16
|
|
|
18
17
|
# Pgbelt
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
pgbelt/__init__.py,sha256=0FxxDo2hLiQpxjY5NS48g2XC_nRMKPJf5X0aGIxmMo4,137
|
|
2
|
+
pgbelt/cmd/__init__.py,sha256=28SxbIChyvJ1mLoI8XJQPrPPwKA6852V9jtnFm8R0Nw,462
|
|
3
|
+
pgbelt/cmd/convenience.py,sha256=Ft3jff7qVSoNiUofkb-opb6BLqmzHN-cw_9RMpukY0k,2275
|
|
4
|
+
pgbelt/cmd/helpers.py,sha256=KQEZI2_zbn8c5fhnBq-UFsC68mmbCoQ2DspOx7kV6K4,5191
|
|
5
|
+
pgbelt/cmd/login.py,sha256=kyDT755YsScg3QA4ZlkyIq3J0WO4XqMepMchufjuaDE,3043
|
|
6
|
+
pgbelt/cmd/preflight.py,sha256=dixdYtFI0hq76MtA6qdI8D28jEpTIL9ujGfHT77nnY0,8215
|
|
7
|
+
pgbelt/cmd/schema.py,sha256=qVjXGVjRl1Si7Ej8Y9gAQ9fIAbxDeFckx5SjBMiOSSA,3148
|
|
8
|
+
pgbelt/cmd/setup.py,sha256=WF4abBHpTcdofCAgGjM6jlI1nfAFy4C_7NFTORBBfPM,5082
|
|
9
|
+
pgbelt/cmd/status.py,sha256=r-Zv5QiO7oQQBTewnTXOdl-IslNGE6lAxlgArAYRTWU,3190
|
|
10
|
+
pgbelt/cmd/sync.py,sha256=3TlFMMQcRMY0NJKjuxJVbsv6RTfnYyn6iLkkHll2iPo,8080
|
|
11
|
+
pgbelt/cmd/teardown.py,sha256=x3znrnreQ0Q4WLUosQN_R6ONEPai9bqUsFXZ1yuh5xw,3754
|
|
12
|
+
pgbelt/config/__init__.py,sha256=SXok1aZcpMYJpX_hk5cuKO33CJ5s8IESkswNN9KsVSo,35
|
|
13
|
+
pgbelt/config/config.py,sha256=v-ASmiZTdVnQAyCWz3fSi37-YjwuKAEHJ7rakgXdIGc,3724
|
|
14
|
+
pgbelt/config/models.py,sha256=tb7hMP7XIwliSMEKHS_21agulSVLfTGzDvXVXpT-VZo,5311
|
|
15
|
+
pgbelt/config/remote.py,sha256=x-ZoMTGpHHx_srXmPxbESUjlU0txcZcjMSJwDsX5W6I,5152
|
|
16
|
+
pgbelt/main.py,sha256=YiagBiGt8pbNlukkRxROXnQX1Tx6ax7c6riuHRCrPYU,186
|
|
17
|
+
pgbelt/util/__init__.py,sha256=-6KkvVMz-yGNQfeoo4CZZrgWKXYmFd4CMyoiao8OnFE,40
|
|
18
|
+
pgbelt/util/asyncfuncs.py,sha256=7i_GpBmUNNZ8RUGvU-q5nclsoaCm6Lx8jLP8usYvmZc,583
|
|
19
|
+
pgbelt/util/dump.py,sha256=zcP3uTnm91qCKsfkmnrCxEvdmOIaXZFKwAtABjYobUk,9698
|
|
20
|
+
pgbelt/util/logs.py,sha256=7cDVL4lnFSEg1WK3zesWp6fdLVqjBN2GOvY04P5tkeo,1424
|
|
21
|
+
pgbelt/util/pglogical.py,sha256=zwYCNeeUsYvH0HbVfybi6gjo73Udukudq-LWdlxfmdw,12309
|
|
22
|
+
pgbelt/util/postgres.py,sha256=ekqt_XFPeSCRjh3jZeXtYsXDFyKd3_btReYkbYY0qgU,13669
|
|
23
|
+
pgbelt-0.2.0.dist-info/LICENSE,sha256=FQ5cFkW02dKK3LmKH8z-rwn93tWSCh7lsxfNUiWcFsg,10758
|
|
24
|
+
pgbelt-0.2.0.dist-info/METADATA,sha256=bEkKwx5CCWp1BY6y73cFfJ5FcEA2bexyzS3Ev2va56Y,2683
|
|
25
|
+
pgbelt-0.2.0.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
|
|
26
|
+
pgbelt-0.2.0.dist-info/entry_points.txt,sha256=SCz_poPjkaVnWpJ-CeytAnDzbVc6l0WalOwitIqW_3g,40
|
|
27
|
+
pgbelt-0.2.0.dist-info/RECORD,,
|
pgbelt-0.1.2.dist-info/RECORD
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
pgbelt/__init__.py,sha256=0FxxDo2hLiQpxjY5NS48g2XC_nRMKPJf5X0aGIxmMo4,137
|
|
2
|
-
pgbelt/cmd/__init__.py,sha256=28SxbIChyvJ1mLoI8XJQPrPPwKA6852V9jtnFm8R0Nw,462
|
|
3
|
-
pgbelt/cmd/convenience.py,sha256=Dguchr4OfGTh26ooVXTc7TWxI6_FrnkII9WdmLTn2vY,2301
|
|
4
|
-
pgbelt/cmd/helpers.py,sha256=pAZiQvHEPgbEF6Al58qWhGPcvv0Z998jO0BKHwm__gY,5217
|
|
5
|
-
pgbelt/cmd/login.py,sha256=sAlHR13YjcmoQE3LLByxs6vFdjD_DdQF6JmzqBG9kIA,3035
|
|
6
|
-
pgbelt/cmd/preflight.py,sha256=XwIheCownZUQfzr25nEDK8BdUPdfDdEMexieEmdXucw,8206
|
|
7
|
-
pgbelt/cmd/schema.py,sha256=qXN6hHSyTWcwmPC6y9iQns_45hQjQ2j7RDPLxrtnE2A,3139
|
|
8
|
-
pgbelt/cmd/setup.py,sha256=JxGFMG7SvfVPpDa40u2XmVCszwtEDHkhG5JjhBb6Seo,5074
|
|
9
|
-
pgbelt/cmd/status.py,sha256=hOFl2WeaaxnVXRssXa5PZPJMMK3gHKTdT-LzdOtY8Vs,3182
|
|
10
|
-
pgbelt/cmd/sync.py,sha256=lOWVacT3WqfEhoirGUI-pI3FJbDfzYO-sMC6ivj5J8Y,8071
|
|
11
|
-
pgbelt/cmd/teardown.py,sha256=OF22hdl0OYX3a8P27i6JuQ1B8v0hqGBcv5JkHCbvez8,3746
|
|
12
|
-
pgbelt/config/__init__.py,sha256=SXok1aZcpMYJpX_hk5cuKO33CJ5s8IESkswNN9KsVSo,35
|
|
13
|
-
pgbelt/config/config.py,sha256=_hers3ZGQ7eb6uSz7vJEiNtyKyLfjGEgbOfiI6J6cUQ,3743
|
|
14
|
-
pgbelt/config/models.py,sha256=Lik9bPxV3nTMCeiEcmA1eeZd9Z-6jYgcFs_JZBL5cRE,5363
|
|
15
|
-
pgbelt/config/remote.py,sha256=iqjuEkZK3jSGPtz_sqteNuJFBdcUOnnSDSPcIt_oZPU,5189
|
|
16
|
-
pgbelt/main.py,sha256=TyouyS6X9SqG6-L88AJ0a9WOmFvdFYY-6-YEcivKDVE,187
|
|
17
|
-
pgbelt/util/__init__.py,sha256=-6KkvVMz-yGNQfeoo4CZZrgWKXYmFd4CMyoiao8OnFE,40
|
|
18
|
-
pgbelt/util/asyncfuncs.py,sha256=7i_GpBmUNNZ8RUGvU-q5nclsoaCm6Lx8jLP8usYvmZc,583
|
|
19
|
-
pgbelt/util/dump.py,sha256=EMHgVyujSQWlmAmkkkg34G8fhGiiIY0Ahqe4XMZGsmU,9911
|
|
20
|
-
pgbelt/util/logs.py,sha256=7cDVL4lnFSEg1WK3zesWp6fdLVqjBN2GOvY04P5tkeo,1424
|
|
21
|
-
pgbelt/util/pglogical.py,sha256=zwYCNeeUsYvH0HbVfybi6gjo73Udukudq-LWdlxfmdw,12309
|
|
22
|
-
pgbelt/util/postgres.py,sha256=HmEjKh2CEKVjdl2dVdIu1GJS9Stgw0hrN8xyZnRyYHw,13694
|
|
23
|
-
pgbelt-0.1.2.dist-info/entry_points.txt,sha256=SCz_poPjkaVnWpJ-CeytAnDzbVc6l0WalOwitIqW_3g,40
|
|
24
|
-
pgbelt-0.1.2.dist-info/LICENSE,sha256=FQ5cFkW02dKK3LmKH8z-rwn93tWSCh7lsxfNUiWcFsg,10758
|
|
25
|
-
pgbelt-0.1.2.dist-info/WHEEL,sha256=gSF7fibx4crkLz_A-IKR6kcuq0jJ64KNCkG8_bcaEao,88
|
|
26
|
-
pgbelt-0.1.2.dist-info/METADATA,sha256=fzgmzeEU9iN8-IM98lYk1RiNFloiQcgEkGDKPTTGgd8,2732
|
|
27
|
-
pgbelt-0.1.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|