1
0
Fork 0
This commit is contained in:
A23187 2023-10-17 14:07:47 +08:00 committed by GitHub
commit c279396565
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 62 additions and 3 deletions

View File

@ -129,6 +129,7 @@ Contributors:
* Damien Baty (dbaty)
* blag
* Rob Berry (rob-b)
* A23187 (A-23187)
Creator:
--------

View File

@ -59,6 +59,7 @@ Internal:
* Port to psycopg3 (https://github.com/psycopg/psycopg).
* Fix typos
* Add support for overriding DSN connection information
3.4.1 (2022/03/19)
==================

View File

@ -551,8 +551,8 @@ class PGCli:
passwd=service_config.get("password"),
)
def connect_uri(self, uri):
kwargs = conninfo_to_dict(uri)
def connect_uri(self, uri, **kwargs):
kwargs = conninfo_to_dict(uri, **kwargs)
remap = {"dbname": "database", "password": "passwd"}
kwargs = {remap.get(k, k): v for k, v in kwargs.items()}
self.connect(**kwargs)
@ -1373,7 +1373,9 @@ class PGCli:
)
@click.argument("dbname", default=lambda: None, envvar="PGDATABASE", nargs=1)
@click.argument("username", default=lambda: None, envvar="PGUSER", nargs=1)
@click.pass_context
def cli(
ctx,
dbname,
username_opt,
host,
@ -1489,7 +1491,21 @@ def cli(
fg="red",
)
exit(1)
pgcli.connect_uri(dsn_config)
kwargs = {
"host": host,
"port": port,
"username_opt": username_opt,
"dbname_opt": dbname_opt,
}
remap = {"username_opt": "user", "dbname_opt": "dbname"}
kwargs = {
remap.get(k, k): v
for k, v in kwargs.items()
if ctx.get_parameter_source(k) is click.core.ParameterSource.COMMANDLINE
}
if prompt_passwd:
kwargs["password"] = ""
pgcli.connect_uri(dsn_config, **kwargs)
pgcli.dsn_alias = dsn
elif "://" in database:
pgcli.connect_uri(database)

View File

@ -0,0 +1,41 @@
from unittest.mock import patch
from click.testing import CliRunner
from pgcli.main import PGCli, cli
def test_dsn_override(tmpdir):
old_dsn = "postgresql://old_user:password@old_host:5432/old_db"
new_host = "new_host"
new_port = 5555
new_user = "new_user"
new_dbname = "new_db"
pgclirc = tmpdir.join("rcfile")
pgclirc.write(f"[alias_dsn]\ndsn = {old_dsn}")
with patch.object(
PGCli, "connect_uri", autospec=True, return_value=None
) as mock_connect_uri:
CliRunner().invoke(
cli,
[
"--pgclirc", str(pgclirc),
"-D", "dsn",
"-h", new_host,
"-p", new_port,
"-u", new_user,
"-d", new_dbname,
"-W",
],
)
mock_connect_uri.assert_called_once()
args, kwargs = mock_connect_uri.call_args
assert args[1] == old_dsn
assert kwargs["host"] == new_host
assert kwargs["port"] == new_port
assert kwargs["user"] == new_user
assert kwargs["dbname"] == new_dbname
assert kwargs["password"] == ""