Merging upstream version 3.4.1.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
772ce6ab2e
commit
90476f279e
9 changed files with 64 additions and 8 deletions
1
AUTHORS
1
AUTHORS
|
@ -119,6 +119,7 @@ Contributors:
|
||||||
* Eric R Young (ERYoung11)
|
* Eric R Young (ERYoung11)
|
||||||
* Paweł Sacawa (psacawa)
|
* Paweł Sacawa (psacawa)
|
||||||
* Bruno Inec (sweenu)
|
* Bruno Inec (sweenu)
|
||||||
|
* Daniele Varrazzo
|
||||||
|
|
||||||
Creator:
|
Creator:
|
||||||
--------
|
--------
|
||||||
|
|
28
README.rst
28
README.rst
|
@ -1,7 +1,29 @@
|
||||||
|
We stand with Ukraine
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Ukrainian people are fighting for their country. A lot of civilians, women and children, are suffering. Hundreds were killed and injured, and thousands were displaced.
|
||||||
|
|
||||||
|
This is an image from my home town, Kharkiv. This place is right in the old city center.
|
||||||
|
|
||||||
|
.. image:: screenshots/kharkiv-destroyed.jpg
|
||||||
|
|
||||||
|
Picture by @fomenko_ph (Telegram).
|
||||||
|
|
||||||
|
Please consider donating or volunteering.
|
||||||
|
|
||||||
|
* https://savelife.in.ua/en/donate/
|
||||||
|
* https://www.comebackalive.in.ua/donate
|
||||||
|
* https://www.globalgiving.org/projects/ukraine-crisis-relief-fund/
|
||||||
|
* https://www.savethechildren.org/us/where-we-work/ukraine
|
||||||
|
* https://www.facebook.com/donate/1137971146948461/
|
||||||
|
* https://donate.wck.org/give/393234#!/donation/checkout
|
||||||
|
* https://atlantaforukraine.com/
|
||||||
|
|
||||||
|
|
||||||
A REPL for Postgres
|
A REPL for Postgres
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|Build Status| |CodeCov| |PyPI| |Landscape|
|
|Build Status| |CodeCov| |PyPI| |netlify|
|
||||||
|
|
||||||
This is a postgres client that does auto-completion and syntax highlighting.
|
This is a postgres client that does auto-completion and syntax highlighting.
|
||||||
|
|
||||||
|
@ -366,3 +388,7 @@ Thanks to all the beta testers and contributors for your time and patience. :)
|
||||||
.. |PyPI| image:: https://img.shields.io/pypi/v/pgcli.svg
|
.. |PyPI| image:: https://img.shields.io/pypi/v/pgcli.svg
|
||||||
:target: https://pypi.python.org/pypi/pgcli/
|
:target: https://pypi.python.org/pypi/pgcli/
|
||||||
:alt: Latest Version
|
:alt: Latest Version
|
||||||
|
|
||||||
|
.. |netlify| image:: https://api.netlify.com/api/v1/badges/3a0a14dd-776d-445d-804c-3dd74fe31c4e/deploy-status
|
||||||
|
:target: https://app.netlify.com/sites/pgcli/deploys
|
||||||
|
:alt: Netlify
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
TBD
|
3.4.1 (2022/03/19)
|
||||||
===
|
==================
|
||||||
|
|
||||||
* [List new changes here].
|
Bug fixes:
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Fix the bug with Redshift not displaying word count in status ([related issue](https://github.com/dbcli/pgcli/issues/1320)).
|
||||||
|
|
||||||
3.4.0 (2022/02/21)
|
3.4.0 (2022/02/21)
|
||||||
==================
|
==================
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
__version__ = "3.4.0"
|
__version__ = "3.4.1"
|
||||||
|
|
|
@ -80,6 +80,8 @@ except ImportError:
|
||||||
|
|
||||||
from getpass import getuser
|
from getpass import getuser
|
||||||
from psycopg2 import OperationalError, InterfaceError
|
from psycopg2 import OperationalError, InterfaceError
|
||||||
|
|
||||||
|
# pg3: https://www.psycopg.org/psycopg3/docs/api/conninfo.html
|
||||||
from psycopg2.extensions import make_dsn, parse_dsn
|
from psycopg2.extensions import make_dsn, parse_dsn
|
||||||
import psycopg2
|
import psycopg2
|
||||||
|
|
||||||
|
@ -1545,6 +1547,14 @@ def format_output(title, cur, headers, status, settings):
|
||||||
|
|
||||||
return data, headers
|
return data, headers
|
||||||
|
|
||||||
|
def format_status(cur, status):
|
||||||
|
# redshift does not return rowcount as part of status.
|
||||||
|
# See https://github.com/dbcli/pgcli/issues/1320
|
||||||
|
if cur and hasattr(cur, "rowcount") and cur.rowcount is not None:
|
||||||
|
if status and not status.endswith(str(cur.rowcount)):
|
||||||
|
status += " %s" % cur.rowcount
|
||||||
|
return status
|
||||||
|
|
||||||
output_kwargs = {
|
output_kwargs = {
|
||||||
"sep_title": "RECORD {n}",
|
"sep_title": "RECORD {n}",
|
||||||
"sep_character": "-",
|
"sep_character": "-",
|
||||||
|
@ -1580,12 +1590,15 @@ def format_output(title, cur, headers, status, settings):
|
||||||
if hasattr(cur, "description"):
|
if hasattr(cur, "description"):
|
||||||
column_types = []
|
column_types = []
|
||||||
for d in cur.description:
|
for d in cur.description:
|
||||||
|
# pg3: type_name = cur.adapters.types[d.type_code].name
|
||||||
if (
|
if (
|
||||||
|
# pg3: type_name in ("numeric", "float4", "float8")
|
||||||
d[1] in psycopg2.extensions.DECIMAL.values
|
d[1] in psycopg2.extensions.DECIMAL.values
|
||||||
or d[1] in psycopg2.extensions.FLOAT.values
|
or d[1] in psycopg2.extensions.FLOAT.values
|
||||||
):
|
):
|
||||||
column_types.append(float)
|
column_types.append(float)
|
||||||
if (
|
if (
|
||||||
|
# pg3: type_name in ("int2", "int4", "int8")
|
||||||
d[1] == psycopg2.extensions.INTEGER.values
|
d[1] == psycopg2.extensions.INTEGER.values
|
||||||
or d[1] in psycopg2.extensions.LONGINTEGER.values
|
or d[1] in psycopg2.extensions.LONGINTEGER.values
|
||||||
):
|
):
|
||||||
|
@ -1614,7 +1627,7 @@ def format_output(title, cur, headers, status, settings):
|
||||||
|
|
||||||
# Only print the status if it's not None and we are not producing CSV
|
# Only print the status if it's not None and we are not producing CSV
|
||||||
if status and table_format != "csv":
|
if status and table_format != "csv":
|
||||||
output = itertools.chain(output, [status])
|
output = itertools.chain(output, [format_status(cur, status)])
|
||||||
|
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ _logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# Cast all database input to unicode automatically.
|
# Cast all database input to unicode automatically.
|
||||||
# See http://initd.org/psycopg/docs/usage.html#unicode-handling for more info.
|
# See http://initd.org/psycopg/docs/usage.html#unicode-handling for more info.
|
||||||
|
# pg3: These should be automatic: unicode is the default
|
||||||
ext.register_type(ext.UNICODE)
|
ext.register_type(ext.UNICODE)
|
||||||
ext.register_type(ext.UNICODEARRAY)
|
ext.register_type(ext.UNICODEARRAY)
|
||||||
ext.register_type(ext.new_type((705,), "UNKNOWN", ext.UNICODE))
|
ext.register_type(ext.new_type((705,), "UNKNOWN", ext.UNICODE))
|
||||||
|
@ -32,6 +33,8 @@ _WAIT_SELECT_TIMEOUT = 1
|
||||||
_wait_callback_is_set = False
|
_wait_callback_is_set = False
|
||||||
|
|
||||||
|
|
||||||
|
# pg3: it is already "green" but Ctrl-C breaks the query
|
||||||
|
# pg3: This should be fixed upstream: https://github.com/psycopg/psycopg/issues/231
|
||||||
def _wait_select(conn):
|
def _wait_select(conn):
|
||||||
"""
|
"""
|
||||||
copy-pasted from psycopg2.extras.wait_select
|
copy-pasted from psycopg2.extras.wait_select
|
||||||
|
@ -74,6 +77,8 @@ def _set_wait_callback(is_virtual_database):
|
||||||
ext.set_wait_callback(_wait_select)
|
ext.set_wait_callback(_wait_select)
|
||||||
|
|
||||||
|
|
||||||
|
# pg3: You can do something like:
|
||||||
|
# pg3: cnn.adapters.register_loader("date", psycopg.types.string.TextLoader)
|
||||||
def register_date_typecasters(connection):
|
def register_date_typecasters(connection):
|
||||||
"""
|
"""
|
||||||
Casts date and timestamp values to string, resolves issues with out of
|
Casts date and timestamp values to string, resolves issues with out of
|
||||||
|
@ -124,6 +129,7 @@ def register_json_typecasters(conn, loads_fn):
|
||||||
return available
|
return available
|
||||||
|
|
||||||
|
|
||||||
|
# pg3: Probably you don't need this because by default unknown -> unicode
|
||||||
def register_hstore_typecaster(conn):
|
def register_hstore_typecaster(conn):
|
||||||
"""
|
"""
|
||||||
Instead of using register_hstore() which converts hstore into a python
|
Instead of using register_hstore() which converts hstore into a python
|
||||||
|
@ -142,6 +148,7 @@ def register_hstore_typecaster(conn):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# pg3: I don't know what is this
|
||||||
class ProtocolSafeCursor(psycopg2.extensions.cursor):
|
class ProtocolSafeCursor(psycopg2.extensions.cursor):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.protocol_error = False
|
self.protocol_error = False
|
||||||
|
@ -392,6 +399,7 @@ class PGExecute:
|
||||||
return json_data
|
return json_data
|
||||||
|
|
||||||
def failed_transaction(self):
|
def failed_transaction(self):
|
||||||
|
# pg3: self.conn.info.transaction_status == psycopg.pq.TransactionStatus.INERROR
|
||||||
status = self.conn.get_transaction_status()
|
status = self.conn.get_transaction_status()
|
||||||
return status == ext.TRANSACTION_STATUS_INERROR
|
return status == ext.TRANSACTION_STATUS_INERROR
|
||||||
|
|
||||||
|
@ -541,6 +549,8 @@ class PGExecute:
|
||||||
def view_definition(self, spec):
|
def view_definition(self, spec):
|
||||||
"""Returns the SQL defining views described by `spec`"""
|
"""Returns the SQL defining views described by `spec`"""
|
||||||
|
|
||||||
|
# pg3: you may want to use `psycopg.sql` for client-side composition
|
||||||
|
# pg3: (also available in psycopg2 by the way)
|
||||||
template = "CREATE OR REPLACE {6} VIEW {0}.{1} AS \n{3}"
|
template = "CREATE OR REPLACE {6} VIEW {0}.{1} AS \n{3}"
|
||||||
# 2: relkind, v or m (materialized)
|
# 2: relkind, v or m (materialized)
|
||||||
# 4: reloptions, null
|
# 4: reloptions, null
|
||||||
|
|
|
@ -74,7 +74,7 @@ def upload_distribution_files():
|
||||||
|
|
||||||
|
|
||||||
def push_to_github():
|
def push_to_github():
|
||||||
run_step("git", "push", "origin", "master")
|
run_step("git", "push", "origin", "main")
|
||||||
|
|
||||||
|
|
||||||
def push_tags_to_github():
|
def push_tags_to_github():
|
||||||
|
|
BIN
screenshots/kharkiv-destroyed.jpg
Normal file
BIN
screenshots/kharkiv-destroyed.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 183 KiB |
5
setup.py
5
setup.py
|
@ -6,7 +6,7 @@ from pgcli import __version__
|
||||||
description = "CLI for Postgres Database. With auto-completion and syntax highlighting."
|
description = "CLI for Postgres Database. With auto-completion and syntax highlighting."
|
||||||
|
|
||||||
install_requirements = [
|
install_requirements = [
|
||||||
"pgspecial>=1.11.8",
|
"pgspecial>=1.13.1,<2.0.0",
|
||||||
"click >= 4.1",
|
"click >= 4.1",
|
||||||
"Pygments>=2.0", # Pygments has to be Capitalcased. WTF?
|
"Pygments>=2.0", # Pygments has to be Capitalcased. WTF?
|
||||||
# We still need to use pt-2 unless pt-3 released on Fedora32
|
# We still need to use pt-2 unless pt-3 released on Fedora32
|
||||||
|
@ -34,6 +34,9 @@ setup(
|
||||||
version=__version__,
|
version=__version__,
|
||||||
license="BSD",
|
license="BSD",
|
||||||
url="http://pgcli.com",
|
url="http://pgcli.com",
|
||||||
|
project_urls={
|
||||||
|
"Source": "https://github.com/dbcli/pgcli",
|
||||||
|
},
|
||||||
packages=find_packages(),
|
packages=find_packages(),
|
||||||
package_data={"pgcli": ["pgclirc", "packages/pgliterals/pgliterals.json"]},
|
package_data={"pgcli": ["pgclirc", "packages/pgliterals/pgliterals.json"]},
|
||||||
description=description,
|
description=description,
|
||||||
|
|
Loading…
Add table
Reference in a new issue